ホームページ  >  記事  >  Java  >  インタビュアー: sleep()、wait()、join()、yield() の違いを教えてください。

インタビュアー: sleep()、wait()、join()、yield() の違いを教えてください。

王林
王林転載
2021-03-01 10:18:213605ブラウズ

インタビュアー: sleep()、wait()、join()、yield() の違いを教えてください。

まず、ロック プールと待機プールの概念を紹介します。

最初にロック プールの概念を見てみましょう

同期ロックをめぐって競合する必要があるすべてのスレッドは、ロック プールに配置されます。たとえば、現在のオブジェクトのロックは取得されています。このロック プールで待機しているときに、前のスレッドが同期ロックを解放すると、ロック プール内のスレッドが同期ロックをめぐって競合します。スレッドが同期ロックを取得すると、レディ キューに入ります。 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 サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。