3

複数のスレッドを作成し、その中で呼び出しyield()ています。

java.lang.Thread.yield() メソッドは、現在実行中のスレッド オブジェクトを一時的に停止させ、他のスレッドを実行できるようにします。

同期ブロック内に入りたい他のスレッドを実行することは可能ですか?

synchronized(this.lock)
{
 //calling yield here.

}

ありがとう。

4

3 に答える 3

5

私の知る限り、Yield() は CPU の残りのタイム スライスを放棄し、キューに戻ります。同期されたオブジェクトは解放されません。

于 2013-09-05T11:57:56.310 に答える
4

yieldロックを取得または解放するのではなく、現在のスレッドの実行を一時停止するだけです。そのため、ブロック内で明け渡すとsynchronized、現在のスレッドがロックを解除できず、他のメソッドがsynchronizedブロックに入ることができなくなります。wait/notifyメソッドを使用してロックを解除する必要があります。

Java言語仕様から

Thread.sleep は、現在実行中のスレッドを、システム タイマーとスケジューラの精度と精度に従って、指定された期間スリープ (一時的に実行を停止) させます。スレッドはどのモニターの所有権も失うことはなく、実行の再開はスケジューリングと、スレッドを実行するプロセッサーの可用性に依存します。

Thread.sleep も Thread.yield も同期セマンティクスを持たないことに注意してください。特に、コンパイラは、Thread.sleep または Thread.yield を呼び出す前に、レジスタにキャッシュされた書き込みを共有メモリにフラッシュする必要はなく、Thread.sleep または Thread を呼び出した後に、レジスタにキャッシュされた値を再ロードする必要もありません。 。収率。

于 2013-09-05T11:59:39.447 に答える
0

yield他のスレッドへのコンテキスト スイッチを許可するため、このスレッドはプロセスの CPU 使用率全体を消費しません。スレッドはまだロックを保持しています。デッドロックに対処するのは開発者の責任です。

于 2013-09-05T12:01:39.540 に答える