Этот код не имеет внутренних классов:Темы внутреннего класса
class Threads1 implements Runnable {
int x = 0;
public void run(){
int current = 0;
for(int i = 0; i<4; i++){
current = x;
System.out.println(current + ", ");
x = current + 2;
}
}
}
public class b{
public static void main(String[] args) {
Runnable r1 = new Threads1();
new Thread(r1).start();
new Thread(r1).start();
}
}
ВЫВОД:
0, 2, 0, 4, 6, 2, 4, 6
Этот код использует внутренний класс под названием "Бегун":
public class Threads1 {
int x = 0;
public class Runner implements Runnable {
public void run(){
int current = 0;
for(int i = 0; i<4;i++){
current = x;
System.out.println(current + ", ");
x = current + 2;
}
}
}
public static void main(String[] args) {
new Threads1().go();
}
public void go(){
Runnable r1 = new Runner();
new Thread(r1).start();
new Thread(r1).start();
}
}
ВЫВОД: (0, 2, 4, 4, 6, 8, 10, 6,) или (0, 2, 4, 6, 8, 10, 12, 14,)
Я узнал, что когда создаются два потока, они работают на своих собственных стеках, что означает, что они не разделяют ничего друг с другом, т.е. вывод (0, 2, 0, 4, 6, 2, 4, 6) может быть от (T1 , Т1, Т2, Т1, Т1, Т2, Т2, Т2), где Т1 и Т2 резьба 1 и 2. Автор
Однако, когда я использовал run()
во внутреннем классе, оба потока разделяет переменную Current
друг с другом , Например, выход (0, 2, 4, 4, 6, 8, 10, 6,) может быть от (T1, T1, T1, T2, T2, T2, T2, T1). Как вы можете видеть, на выходе есть double a 4, что означает, что thread1 передал его значение thread2. Почему это так?
Я просто попробовал, на первый взгляд, даже если метод main() в том же классе ..Я получаю одинаковые результаты – user2985842