さびた Java を練習するために、単純なマルチスレッド共有データの例を試してみたかったのですが、驚くべきことに出会いました。
基本的にAtomicInteger
、3 つのスレッド間に共有カウンターがあり、それぞれが順番にインクリメントしてカウンターを出力します。
主要
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();
カウンタースレッド
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
...
代わりに、 100 回A
インクリメント_count
してから に渡す出力を取得しましたB
。3 つのスレッドすべてが一貫して交代することもあれば、1 つのスレッドがいくつかのインクリメントを支配することもあります。
Thread.yield()
処理を常に別のスレッドに譲らないのはなぜですか?