2015-10-16 28 views
0

我想了解中斷如何與Thread.sleep()和Thread.join()一起工作。如何中斷和Thread.sleep()/ Thread.join()動作

例如,如果在一個線程,說t1,我執行Thread.sleep()後從另一個線程我叫t1.interrupt()然後Thread.sleep()拋出和InterruptException。

我想知道的是這一切的機制。正如我所看到的sleep()是一個靜態方法,它如何檢測到中斷已發送到它所調用的線程?

對於案例t1.join()類似,該方法如何看到執行ti.join()的線程已收到中斷並拋出異常?有沒有一種聯繫?

+2

考慮到這是實施和特定平臺,您希望從答案中獲得哪些洞察?這怎麼幫助你解決一些編程問題?即你的問題的根本動機是什麼。 – the8472

+1

sleep是靜態的,因爲它只在當前運行的線程上調用它纔有意義。當您查看Thread的源代碼時,可以看到像sleep和wait這樣的方法是本地方法。情況就是這樣,因爲os處理線程(如果它們是本地的,它們在java中)。所以基本上如果oyu調用中斷,java會將該中斷重定向到os,然後os會喚醒線程,然後java拋出異常。 –

+0

「本地方法」是什麼意思?然而,我不明白的是,Thread.sleep如何理解哪個線程進入睡眠狀態,以及如何提取這些信息。 – zer0uno

回答

1

我想了解中斷如何與Thread.sleep()和Thread.join()一起工作。

這太複雜了,無法詳細解釋。這個實現主要是作爲JVM代碼庫一部分的本地代碼(即C++代碼)以及由OS提供的本地線程支持等等。源代碼可用,如果要閱讀它。

正如我所見sleep()是一個靜態方法,它如何檢測中斷是否發送到它被調用的線程?

靜態方法委派給一個native方法,該方法實現sleep行爲。該本地方法很可能會委託給操作系統提供的本地線程庫(例如pthreads)來查找當前線程......如果有必要的話。 (這是>> < <在Linux情況下會發生什麼。)

中斷也在本地方法中處理。在Linux上,Java native sleep方法調用pthread_sleep。當後者返回時,native sleep方法調用pthread_interrupted以確定pthread_sleep調用是否被中斷,並在必要時拋出Java異常。

「本地方法」是什麼意思?

這些是未在Java代碼中實現的方法。查看java.lang.Thread類的源代碼,您將看到一些具有native修飾符的方法。這些是本地方法。