2012-12-25 41 views
5

有人可以幫我理解Thread.sleep()函數是如何實現的嗎?線程在指定的時間過去或其他線程中斷時恢復/喚醒。我有興趣瞭解這個工作背後的設計模式。Java Thread.sleep()的實現

睡眠據說對CPU消耗沒有影響。當前線程是否添加到偵聽器列表中?何時會檢查中斷標誌?調度程序是否繼續檢查每個「x」時間內正在休眠的每個線程的中斷狀態(根據操作系統支持的情況)?線程如何在不影響CPU的情況下重新獲得控制權。

我已經搜索過此內容。對不起,如果我錯過了任何容易找到的鏈接。

+0

它是由操作系統來實現,而不是Java的。你的問題真的是題外話。 – EJP

回答

13

有人能幫我理解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); 
+0

非常感謝。這打擊了我大部分的誤解。我還有一個問題。 InterruptedException何時構造?是否有一個回調函數在操作系統報告中斷或時間到期時執行? –

+0

@Praneethvarma:當線程喚醒時,它可以檢查它爲什麼被喚醒。我從OpenJVM發佈了執行此檢查的C代碼。 –