[英]Java Thread.sleep() implementation
有人可以幫我理解Thread.sleep()函數是如何實現的嗎? 當指定的時間過去或某些其他線程中斷時,線程將恢復/喚醒。 我有興趣了解這項工作背后的設計模式。
據說睡眠對CPU消耗沒有影響。 當前線程是否已添加到偵聽器列表中? 什么時候會檢查中斷標志? 調度程序是否繼續檢查每個“x”時間內正在休眠的每個線程的中斷狀態(基於操作系統支持的內容)? 線程如何在不影響CPU的情況下獲得控制權。
我搜索過這個。 對不起,如果我錯過了任何容易找到的鏈接。
有人可以幫我理解Thread.sleep()函數是如何實現的嗎?
它在操作系統提供的底層本機線程上調用sleep
。
據說睡眠對CPU消耗沒有影響。
未運行的線程不占用CPU時間。
當前線程是否已添加到偵聽器列表中?
沒有。
什么時候會檢查中斷標志?
線程無法檢查中斷標志,因為它沒有運行。 如果請求,操作系統可以喚醒線程。
調度程序是否繼續檢查每個“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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.