Как правильно инкрементировать числа в потоке?
Только начал изучать потоки и к сожалению еще не совсем разбираюсь в них. Мне в методе test() нельзя использовать synchronaized.
Вопрос: почему не инкрементируются переменные counter и counter2?
Задание: Метод test запускает на выполнение n дочерних потоков, каждый из которых в цикле повторяет k раз следующее:
- печатает значения счетчиков counter и counter2 через пробел;
- увеличивает первый счетчик counter на единицу;
- засыпает на t мсек;
- увеличивает второй счетчик counter2 на единицу.
Код:
public class Part3 extends Thread {
private int counter;
private int counter2;
private int time;
private int repeat;
private int thread;
private Thread[] threads;
public Part3(int n, int k, int t) {
this.thread = n;
this.repeat = k;
this.time = t;
threads = new Thread[n];
}
public void test() {
System.out.println("В тесте........................");
for (int i = 0; i < thread; i++) {
threads[i] = new Thread(this);
System.out.println(counter + "................counter1");
System.out.println(counter2 + "...............counter2");
threads[i].start();
}
}
@Override
public void run() {
System.out.println("В ране...................");
for (int i = 0; i < repeat; i++) {
counter++;
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
counter2++;
}
}
public static void main(String[] args) {
Part3 p = new Part3(3, 5, 100);
p.test();
}
}
Ответы (1 шт):
Автор решения: Barmaley Red Star
→ Ссылка
Надо использовать специально предусмотренный для таких случаев атомарный класс
public class Part3 extends Thread {
private AtomicInteger counter=new AtomicInteger(0);
//blah-blah
@Override
public void run() {
//blah-blah
counter.getAndIncrement();
}