誰かがThread.sleep()関数がどのように実装されているかを理解するのを手伝ってもらえますか?
sleep
オペレーティングシステムによって提供される基盤となるネイティブスレッドを呼び出します。
スリープはCPU消費に影響を与えないと言われています。
実行されていないスレッドはCPU時間を消費しません。
現在のスレッドはリスナーのリストに追加されていますか?
いいえ。
割り込みフラグのチェックはいつ行われますか?
スレッドは実行されていないため、割り込みフラグをチェックできません。オペレーティングシステムは、要求された場合にスレッドをウェイクアップできます。
スケジューラーは、(OSがサポートするものに基づいて)「x」時間ごとにスリープしているすべてのスレッドの割り込みステータスをチェックし続けますか?
いいえ。
スレッドは、CPUに影響を与えることなく、どのようにして制御を取り戻すのでしょうか。
時間が経過すると、スレッドはオペレーティングシステムによって自動的にウェイクアップされます。または、別のスレッドがオペレーティングシステムにスレッドを早期にウェイクアップするように要求できます。
OpenJVMのThread.sleep()の背後にあるコードの一部を次に示します。
2811 ThreadState old_state = thread->osthread()->get_state();
2812 thread->osthread()->set_state(SLEEPING);
2813 if (os::sleep(thread, millis, true) == OS_INTRPT) {
2814 // An asynchronous exception (e.g., ThreadDeathException) could have been thrown on
2815 // us while we were sleeping. We do not overwrite those.
2816 if (!HAS_PENDING_EXCEPTION) {
2817 HS_DTRACE_PROBE1(hotspot, thread__sleep__end,1);
2818 // TODO-FIXME: THROW_MSG returns which means we will not call set_state()
2819 // to properly restore the thread state. That's likely wrong.
2820 THROW_MSG(vmSymbols::java_lang_InterruptedException(), "sleep interrupted");
2821 }
2822 }
2823 thread->osthread()->set_state(old_state);