複数のスレッドを作成し、その中で呼び出しyield()
ています。
java.lang.Thread.yield() メソッドは、現在実行中のスレッド オブジェクトを一時的に停止させ、他のスレッドを実行できるようにします。
同期ブロック内に入りたい他のスレッドを実行することは可能ですか?
synchronized(this.lock)
{
//calling yield here.
}
ありがとう。
複数のスレッドを作成し、その中で呼び出しyield()
ています。
java.lang.Thread.yield() メソッドは、現在実行中のスレッド オブジェクトを一時的に停止させ、他のスレッドを実行できるようにします。
同期ブロック内に入りたい他のスレッドを実行することは可能ですか?
synchronized(this.lock)
{
//calling yield here.
}
ありがとう。
私の知る限り、Yield() は CPU の残りのタイム スライスを放棄し、キューに戻ります。同期されたオブジェクトは解放されません。
yield
ロックを取得または解放するのではなく、現在のスレッドの実行を一時停止するだけです。そのため、ブロック内で明け渡すとsynchronized
、現在のスレッドがロックを解除できず、他のメソッドがsynchronized
ブロックに入ることができなくなります。wait/notify
メソッドを使用してロックを解除する必要があります。
Java言語仕様から
Thread.sleep は、現在実行中のスレッドを、システム タイマーとスケジューラの精度と精度に従って、指定された期間スリープ (一時的に実行を停止) させます。スレッドはどのモニターの所有権も失うことはなく、実行の再開はスケジューリングと、スレッドを実行するプロセッサーの可用性に依存します。
Thread.sleep も Thread.yield も同期セマンティクスを持たないことに注意してください。特に、コンパイラは、Thread.sleep または Thread.yield を呼び出す前に、レジスタにキャッシュされた書き込みを共有メモリにフラッシュする必要はなく、Thread.sleep または Thread を呼び出した後に、レジスタにキャッシュされた値を再ロードする必要もありません。 。収率。
yield
他のスレッドへのコンテキスト スイッチを許可するため、このスレッドはプロセスの CPU 使用率全体を消費しません。スレッドはまだロックを保持しています。デッドロックに対処するのは開発者の責任です。