有人可以幫我理解Thread.sleep()函數是如何實現的嗎?線程在指定的時間過去或其他線程中斷時恢復/喚醒。我有興趣瞭解這個工作背後的設計模式。Java Thread.sleep()的實現
睡眠據說對CPU消耗沒有影響。當前線程是否添加到偵聽器列表中?何時會檢查中斷標誌?調度程序是否繼續檢查每個「x」時間內正在休眠的每個線程的中斷狀態(根據操作系統支持的情況)?線程如何在不影響CPU的情況下重新獲得控制權。
我已經搜索過此內容。對不起,如果我錯過了任何容易找到的鏈接。
有人可以幫我理解Thread.sleep()函數是如何實現的嗎?線程在指定的時間過去或其他線程中斷時恢復/喚醒。我有興趣瞭解這個工作背後的設計模式。Java 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);
非常感謝。這打擊了我大部分的誤解。我還有一個問題。 InterruptedException何時構造?是否有一個回調函數在操作系統報告中斷或時間到期時執行? –
@Praneethvarma:當線程喚醒時,它可以檢查它爲什麼被喚醒。我從OpenJVM發佈了執行此檢查的C代碼。 –
它是由操作系統來實現,而不是Java的。你的問題真的是題外話。 – EJP