まず、ロック プールと待機プールの概念を紹介します。
最初にロック プールの概念を見てみましょう
同期ロックをめぐって競合する必要があるすべてのスレッドは、ロック プールに配置されます。たとえば、現在のオブジェクトのロックは取得されています。このロック プールで待機しているときに、前のスレッドが同期ロックを解放すると、ロック プール内のスレッドが同期ロックをめぐって競合します。スレッドが同期ロックを取得すると、レディ キューに入ります。 CPU リソースの割り当てを待ちます。
待機プールの概念を見てみましょう
wait() メソッドを呼び出すと、スレッドは待機プールに配置され、プール内で待機しているスレッドは待機プールに配置されません。同期ロックをめぐって競合します。 Notice() または NotifyAll() を呼び出した後でのみ、待機プール内のスレッドがロックの競合を開始します。notify() は待機プールからランダムにスレッドを選択してロック プールに入れますが、notifyAll() はすべてのスレッドを入れます。待機プールにある ロックプールに入れます。
sleep は Thread クラスの静的ローカル メソッドであり、wait は Object のローカル メソッドです。
sleep メソッドはロックを解放しませんが、wait メソッドはロックを解放し、待機キューに追加します。
sleep就是把cpu的执行资格和执行权释放出去,不再运行此线程,当定时事件结束再取回cpu资源,参与cpu的调度,获取到cpu资源后就可以继续运行了,而如果sleep时该线程有锁,那么sleep不会释放这个锁,而是把锁带着进入了冻结状态,也就是说其它需要这个锁的线程根本不可能获取到这个锁。也就是说无法执行程序,如果在睡眠期间其它线程调用了这个线程的interrupt方法,那么这个线程也会抛出interruptexception异常返回,这点和wait是一样的。
sleep メソッドは synchronized シンクロナイザーに依存しませんが、wait は synchronized キーワードに依存する必要があります。
sleep はウェイクアップする必要はありません (スリープ後にブロックを終了します) が、wait はウェイクアップする必要があります (指定された時間に他の人によって中断される必要はありません)。
sleep は通常、現在のスレッドのスリープ、または操作のポーリングと一時停止に使用されますが、wait は主に複数のスレッド間の通信に使用されます。
sleep は CPU 実行時間を放棄し、コンテキストの切り替えを強制しますが、wait はそうではありません。wait 後も、再度ロックを競合して実行を継続する可能性があります。
yield() 実行後、スレッドは直接準備完了状態となり、すぐに CPU の実行権を解放しますが、CPU の実行資格は保持したままであるため、次のことが考えられます。次回は CPU がスレッドのスケジューリングを実行し、このスレッドが実行権を取得して実行を継続します。
(学習ビデオ共有: java ビデオ チュートリアル)
join() が実行された後、スレッドはブロッキング状態に入ります。たとえば、スレッドの join() を呼び出します。 A がスレッド B にある場合、スレッド B はブロッキング キューに入り、スレッド A にスレッドを終了または中断するよう指示します。
public static void main(String[] args) throws InterruptedException { Thread t1=new Thread(()->{ try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("休眠sleep线程"); }); t1.start(); t1.join(); System.out.println("线程执行完成"); }
元のリンク: https://blog.csdn.net/lxn1023143182/article/details/114134498
関連する推奨事項: Java 面接の質問と回答
以上がインタビュアー: sleep()、wait()、join()、yield() の違いを教えてください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。