Thread.yield()メソッドに関するいくつかの質問。私が理解していることは、Thread.Yield()を呼び出すと、現在実行中のスレッドは実行可能状態に戻ります。スレッドの優先順位に依存するスレッドスケジューラは、次に優先度の高いスレッドを実行します。今私は1つのサンプルプログラムを持っています。下記を参照してください。yieldに関する疑問()
package thread;
public class YieldTest implements Runnable {
@Override
public synchronized void run() {
System.out.println(Thread.currentThread().getName()+", executing..");
for(int i = 0 ; i <5;i++){
if(i==2){
Thread.yield();
System.out.println(Thread.currentThread().getName()+": "+i+" yielded()");
/*try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+": "+i+" yielded()");
} catch (InterruptedException e) {
e.printStackTrace();
}*/
}else{
System.out.println(Thread.currentThread().getName()+": "+i);
}
}
}
public static void main(String[] args) {
YieldTest test = new YieldTest();
Thread t1 = new Thread(test);
t1.setName("A");
t1.setPriority(9);
Thread t2 = new Thread(test);
t2.setName("B");
Thread t3 = new Thread(test);
t3.setName("C");
t2.setPriority(6);
t2.setPriority(4);
t1.start();
t2.start();
t3.start();
}
}
ここで私は、次のように常に
A, executing..
A: 0
A: 1
A: 2 yielded()
A: 3
A: 4
C, executing..
C: 0
C: 1
C: 2 yielded()
C: 3
C: 4
B, executing..
B: 0
B: 1
B: 2 yielded()
B: 3
B: 4
を出力を取得しています今の質問は、収率(ある)メソッドは、バックrunable状態に行く必要があり、他のスレッドが実行する必要があります。 0 A:1 A:そう出力.. A実行し、次のよう
Aのようなものでなければならない0 C:2 .. Cを実行する()
Cを得1個の C:2が得られた()
A: 3
A: 4
B、実行.. B:0 B:1 B:2が得られた()
C: 3
C: 4
B: 3
B: 4
また、スレッドの優先順位はどうですか。なぜ私たちはスレッドの優先順位が必要なのか保証されていませんか?私が間違っている場合は私を修正してください。
あなたは本当に解決しようとしている問題は何ですか?おそらく 'yield()'を呼び出すことは最良の解決策ではありません。 –
'yield()'の詳細については、[この質問](http://stackoverflow.com/questions/5156985/how-does-method-yield-work)を参照してください。 – Pops
この特定のシナリオでは、スレッドAがBの前に完了しても起動する時間があっても、私は驚くことはありません。 – pap