6

誰かがThread.sleep()関数がどのように実装されているかを理解するのを手伝ってもらえますか?指定された時間が経過したとき、または他のスレッドが中断したときに、スレッドは再開/ウェイクアップします。この作業の背後にあるデザインパターンを理解することに興味があります。

スリープはCPU消費に影響を与えないと言われています。現在のスレッドはリスナーのリストに追加されていますか?割り込みフラグのチェックはいつ行われますか?スケジューラーは、(OSがサポートするものに基づいて)「x」時間ごとにスリープしているすべてのスレッドの割り込みステータスをチェックし続けますか?スレッドは、CPUに影響を与えることなく、どのようにして制御を取り戻すのでしょうか。

これを検索しました。見つけやすいリンクを見逃してしまったらごめんなさい。

4

1 に答える 1

14

誰かが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);
于 2012-12-25T00:39:58.563 に答える