2010-02-18 76 views
9

在某個線程上調用Thread.interrupt()時,該線程會發生什麼?當某個線程調用Thread.interrupt()時,會發生什麼?

+1

你能更具體嗎?在我看來,文檔談論得非常好:http://java.sun.com/javase/6/docs/api/java/lang/Thread。html#interrupt()我假設有些東西沒有說清楚,但是,如果你可以改進你的問題? – 2010-02-18 15:49:02

回答

30

目標線程被「中斷」。大多數情況下,該線程中會設置一個標誌,線程可以查看該標誌(使用Thread.interrupted())。如果目標線程當前在某些I/O或Object.wait()上被阻止,則分別用InterruptedIOExceptionInterruptedException將其喚醒。

線程中斷是微調線程的溫和方式。這是用來給線程一個機會退出乾淨地,而不是Thread.stop(),這更像是用突擊步槍射擊線程。

+1

'InterruptedIOException'不太可能是練習。可簡便地在Solaris中啓用可中斷I/O,但它不值得。當然這個實現是針對特定實現的。通常(最近)操作系統將與線程有關。 – 2010-02-18 16:07:10

+7

+1爲你自己解釋和shoting比較。 – helios 2010-02-18 16:43:13

2

這裏是JDK 1.6 Javadoc

中斷該線程。

除非當前線程是 中斷本身,它總是允許 ,的 checkAccess方法該線程被調用,這可以導致 一個SecurityException是 拋出。

如果該線程被阻塞在 調用等待(的),等待(長), 或等待(長,INT)的 對象類的方法,或的連接(), 加入(長),加入(long,int), sleep(long)或sleep(long,int), 這個類的方法,然後它的 中斷狀態將被清除,並且 它會收到一個 InterruptedException。

如果該線程在可中斷 通道阻塞在一個I/O操作 則通道將是 關閉時,線程的中斷狀態 將被設置,並且該線程將 接收ClosedByInterruptException。

如果該線程被阻塞在 選擇則該線程的中斷 狀態將被設置,它會立即返回 從選擇 操作,可能與非零 值,就好像選擇的 喚醒方法被調用。

如果以前的條件 都不成立,則會設置此線程的中斷 狀態。

中斷不是 的線程不需要有效。

0

ZeissS是正確的,信號是最乾淨的方式。你也可以捕獲中斷異常並進行清理。

相關問題