簡體   English   中英

Java Thread.sleep()實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM