Пытаясь попрактиковаться в моей ржавой Java, я хотел попробовать простой пример многопоточных общих данных и наткнулся на кое-что, что меня удивило.
По сути, у нас есть общий счетчик AtomicInteger
между тремя потоками, каждый из которых по очереди увеличивает и печатает счетчик.
главный
AtomicInteger counter = new AtomicInteger(0);
CounterThread ct1 = new CounterThread(counter, "A");
CounterThread ct2 = new CounterThread(counter, "B");
CounterThread ct3 = new CounterThread(counter, "C");
ct1.start();
ct2.start();
ct3.start();
CounterThread
public class CounterThread extends Thread
{
private AtomicInteger _count;
private String _id;
public CounterThread(AtomicInteger count, String id)
{
_count = count;
_id = id;
}
public void run()
{
while(_count.get() < 1000)
{
System.out.println(_id + ": " + _count.incrementAndGet());
Thread.yield();
}
}
}
Я ожидал, что когда каждый поток выполнит Thread.yield()
, он передаст выполнение другому потоку, чтобы увеличить _count
следующим образом:
A: 1
B: 2
C: 3
A: 4
...
Вместо этого я получил результат, в котором A
увеличил бы _count
в 100 раз, а затем передал его B
. Иногда все три потока последовательно сменяют друг друга, но иногда один поток доминирует в течение нескольких шагов.
Почему Thread.yield()
не всегда передает обработку другому потоку?
yield()
- это предложение. - person Sotirios Delimanolis   schedule 11.09.2013Thread
гарантирован, я просто был сбит с толку, когдаThread
вел себя не так, как documentation Заставляет текущий выполняющийся объект потока временно приостановить и разрешить выполнение других потоков. - person Cory Klein   schedule 11.09.2013