Почему программа странно работает, joja должна быть по идее 20 в конце потоков?
Вот весь код: Главный класс:
public class Grandest {
public static MyThread thread = new MyThread();
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
MyThreadTwo myThread = new MyThreadTwo();
myThread.start();
}
public synchronized void fori () {
int joja = 1;
for (int i = 0; i <= 10; i++) {
System.out.println("Поток:" + Thread.currentThread().getName() + " " + i);
joja = joja++;
System.out.println(joja);
}
}
}
И вот два отдельных потомка Thread'а :
public class MyThread extends Thread {
Grandest grand = new Grandest();
@Override
public void run() {
grand.fori();
}
}
public class MyThreadTwo extends Thread {
Grandest grand = new Grandest();
@Override
public void run() {
grand.fori();
}
}
вот что выдает золотая консоль:
Поток:Thread-1 0
1
Поток:Thread-1 1
1
Поток:Thread-1 2
1
Поток:Thread-1 3
1
Поток:Thread-1 4
1
Поток:Thread-1 5
1
Поток:Thread-1 6
Поток:Thread-2 0
1
Поток:Thread-2 1
1
Поток:Thread-2 2
1
Поток:Thread-2 3
1
Поток:Thread-2 4
1
Поток:Thread-2 5
1
Поток:Thread-2 6
1
Поток:Thread-2 7
1
Поток:Thread-2 8
1
Поток:Thread-2 9
1
Поток:Thread-2 10
1
1
Поток:Thread-1 7
1
Поток:Thread-1 8
1
Поток:Thread-1 9
1
Поток:Thread-1 10
1
Ответы (1 шт):
Нет, ваша программа работает верно.
jola - локальная переменная метода. Она видна только в методе fori() и заново инициализируется каждый раз, как в метод заходит поток.
Чтобы получить на выходе число 20, сделайте jola статической переменной класса. Либо просто переменной класса, но тогда не создавайте для каждого потока свой экземпляр Grandest.
Позволю себе также несколько замечаний по коду:
1. Зачем вы делаете одинаковые классы MyThread и MyThreadTwo? Сделайте один, создайте два его экземпляра и запустите их:
public static void main(String[] args) {
MyThread thread1 = new MyThread();
MyThread thread2 = new MyThread();
thread1.start();
thread2.start();
}
2. Рекомендую не создавать Grandest в каждом потоке, а создать один и передать его в качестве параметра в оба потока. Тогда jola можно сделать не статической переменной класса, а просто переменной класса.
3. Удалите synchronized (сейчас он вообще не работает, потому что у вас в каждом потоке создаётся свой экземпляр класса Grandest). Сделайте переменную jola AtomicInteger - потокобезопасная версия Integer.