1

Yield の定義については、少し疑問があります。

Java ドキュメントで。収量は次のように表されます。

public static void [yield][1]()

現在のスレッドがプロセッサの現在の使用を放棄する意思があるというスケジューラへのヒント。スケジューラは、このヒントを自由に無視できます。

これは、現在のスレッドが一時的に停止していないことを意味します。スケジューラに指示しているだけです。スレッドの実行を停止するかどうかを決定するのは、スケジューラ次第です。

そして、このリンクでは、yield 時にスレッドが確実に中断されると書かれています。

http://www.tutorialspoint.com/java/lang/thread_yield.htm

誰かがそれを説明できますか?

4

3 に答える 3

4

これは、現在のスレッドが一時的に停止していないことを意味します。スケジューラに指示しているだけです。ここで、スレッドの実行を停止するかどうかを決定するのはスケジューラ次第です。右?

右!

javadoc にそう書かれていれば、それは正しいことです。javadoc は決定的です。実装はを無視することが許可されていると言っていyieldます。あなたが見つけたすべての Java 実装がそうではなかったとしても、javadoc は新しい実装がそれをすることができると言っています。

実際、スレッド スケジューラyieldがスケジュールの準備が整っているシステムが他にない場合、スレッド スケジューラが を無視するのは非常に合理的です。

そして、このリンクでは、yield 時にスレッドが確実に中断されると書かれています。

そのリンク先のページは正しくありません。簡潔でシンプル。


スレッドを確実に一時停止させたい場合はsleep(...)、0 より大きい引数を指定して呼び出します。javadoc は次のように述べています。

「現在実行中のスレッドを、指定されたミリ秒数だけスリープ (一時的に実行を停止) させます。これは、システム タイマーとスケジューラの精度と精度に依存します。」

後者は、スレッドがスリープする時間を正確に予測できないことを意味します...しかし、スレッドはスリープします。(実際には、スレッドが指定された引数よりも短い時間スリープすることはほとんどありません...)

于 2013-09-06T04:56:52.690 に答える
0

プリエンプティブ スケジューリング OS (最新のすべての OS と同様) では、譲渡は、オペレーティング システムへの譲渡要求です。オペレーティング システムに、Java またはその他のユーザー空間コードで別のスレッドを実行させることはできません。常にスケジューラに翻弄されます。ビートをスキップすることなく、すぐにスケジュールを変更できます。これは実際、ロックフリー アルゴリズムを非常に興味深いものにしている理由の 1 つです。たとえスケジューラーが異常であっても、スケジューラーは機能し続けます。

そうは言っても、OS は、yield() を実際に意図した場合、実際にスレッドを切り替える傾向があることを理解しています。

于 2013-09-06T04:54:57.233 に答える