Thread.yield()
誰かが方法と方法の違いを説明できますかThread.sleep()
?
理解方法:Thread.yield()
JVMが次に実行することを決定した他のスレッドにモニターロックをThread.sleep()
放棄し、モニターロックを放棄せずに現在のスレッドを所定のミリ秒の間スリープモードにします。
Thread.yield()
誰かが方法と方法の違いを説明できますかThread.sleep()
?
理解方法:Thread.yield()
JVMが次に実行することを決定した他のスレッドにモニターロックをThread.sleep()
放棄し、モニターロックを放棄せずに現在のスレッドを所定のミリ秒の間スリープモードにします。
これによると、使用しているJavaのバージョンによって異なります。
Java 5では、
Thread.yield()
WindowsAPIを呼び出しますSleep(0)
。これには、現在のスレッドのクォンタム(CPUに割り当てられたタイムスライスの数)をクリアし、優先度レベルのキューの最後に置くという特殊効果があります。つまり、同じ優先度の実行可能なスレッド(および優先度の高いスレッド)はすべて、生成されたスレッドに次にCPU時間が与えられる前に実行する機会があります。最終的に再スケジュールされると、完全なクォンタムで戻りますが、譲歩の時点から残りのクォンタムを「引き継ぐ」ことはありません。この動作は、スリープしているスレッドが一般に1クォンタム値を失うゼロ以外のスリープとは少し異なります(実際には、10または15ミリ秒のティックの1/3)。Java 6では、この動作が変更されました。Hotspot VMは 、 WindowsAPI呼び出し
Thread.yield()
を使用して実装するようになりました。SwitchToThread()
この呼び出しにより、現在のスレッドは現在のタイムスライスを放棄しますが、クォンタム全体は放棄しません。これは、他のスレッドの優先順位に応じて、降伏するスレッドを1つの割り込み期間後にスケジュールし直すことができることを意味します。
Thread.sleep()
使用しているJavaのバージョンに関係なく、現在のスレッドを指定された時間中断します。
Thread.sleep() は、スレッドを一定期間または中断されるまでスリープ状態にします。Thread.yield() はスレッドをスリープ状態にしません。代わりに、スレッドを一時的に一時停止して、他のスレッドがその仕事を行えるようにします。
近い。Thread.sleep は、スレッドを指定された時間スリープさせますが、ロックを放棄しません。
Thread.yield もロックを放棄しません。別のスレッドにいくつかのサイクルを与えるようにスレッドスケジューラにヒントを与えるだけです。
それらはまったく同じものではなく、非常に異なっています。
あなたが解決しようとしている特定の問題はありますか?