在某個線程上調用Thread.interrupt()
時,該線程會發生什麼?當某個線程調用Thread.interrupt()時,會發生什麼?
回答
目標線程被「中斷」。大多數情況下,該線程中會設置一個標誌,線程可以查看該標誌(使用Thread.interrupted()
)。如果目標線程當前在某些I/O或Object.wait()
上被阻止,則分別用InterruptedIOException
或InterruptedException
將其喚醒。
線程中斷是微調線程的溫和方式。這是用來給線程一個機會退出乾淨地,而不是Thread.stop()
,這更像是用突擊步槍射擊線程。
'InterruptedIOException'不太可能是練習。可簡便地在Solaris中啓用可中斷I/O,但它不值得。當然這個實現是針對特定實現的。通常(最近)操作系統將與線程有關。 – 2010-02-18 16:07:10
+1爲你自己解釋和shoting比較。 – helios 2010-02-18 16:43:13
Javadoc for that method解釋在什麼情況下會發生什麼。
這裏是JDK 1.6 Javadoc:
中斷該線程。
除非當前線程是 中斷本身,它總是允許 ,的 checkAccess方法該線程被調用,這可以導致 一個SecurityException是 拋出。
如果該線程被阻塞在 調用等待(的),等待(長), 或等待(長,INT)的 對象類的方法,或的連接(), 加入(長),加入(long,int), sleep(long)或sleep(long,int), 這個類的方法,然後它的 中斷狀態將被清除,並且 它會收到一個 InterruptedException。
如果該線程在可中斷 通道阻塞在一個I/O操作 則通道將是 關閉時,線程的中斷狀態 將被設置,並且該線程將 接收ClosedByInterruptException。
如果該線程被阻塞在 選擇則該線程的中斷 狀態將被設置,它會立即返回 從選擇 操作,可能與非零 值,就好像選擇的 喚醒方法被調用。
如果以前的條件 都不成立,則會設置此線程的中斷 狀態。
中斷不是 的線程不需要有效。
ZeissS是正確的,信號是最乾淨的方式。你也可以捕獲中斷異常並進行清理。
- 1. 當主線程調用sys.exit()時,其他線程會發生什麼?
- 2. 當你調用一個線程的中斷()時會發生什麼?
- 3. 當第一個線程鎖定類時第二個線程會發生什麼
- 4. 當SIGCANCEL發送到線程時會發生什麼?
- 5. 當一個線程完成其互斥量時,線程會發生什麼?
- 6. 當一個線程被阻塞時,其他線程會發生什麼?
- 7. 當調用ajax調用時會發生什麼?
- 8. 當主線程針對另一個調度隊列發出dispatch_sync時,主隊列/主線程會發生什麼?
- 9. 當主線程終止時,SynchronizationContext會發生什麼?
- 10. 當獲取它的線程退出時,Mutex會發生什麼?
- 11. 當程序運行時發生事件時會發生什麼
- 12. 當一個定時器線程進入睡眠狀態時會發生什麼
- 13. 調用setCancelsTouchesInView時會發生什麼?
- 14. 爲什麼在從另一個線程調用Qt時會發生seg錯誤?
- 15. 線程通過另一個類調用同步方法時會發生什麼?
- 16. 當線程T1加入線程T2和T2時會發生什麼事情會發生中斷
- 17. 在Java中調用某個方法後會發生什麼
- 18. 從Java調用Oracle過程 - 調用System.exit()時會發生什麼?
- 19. 當您爲同一個程序集多次調用Assembly.CreateInstance時會發生什麼?
- 20. 如果當前線程崩潰,那麼readwritelock會發生什麼
- 21. 調用accept()的線程會發生什麼?
- 22. 如果我調用WaitHandle.Dispose(),等待線程會發生什麼?
- 23. 當使用new操作符調用堆中的Class()時發生多個調用時會發生什麼?
- 24. 線程結束後會發生什麼?
- 25. ConcurrentHashMap.clear()讀線程會發生什麼?
- 26. 當兩個線程同時調用相同的靜態方法時會發生什麼?
- 27. 當一個線程在wait()上阻塞時被中斷會發生什麼?
- 28. 當alloc或allocWithZone被調用時會發生什麼?
- 29. 當ContinueWhenAny被調用時,剩下的任務會發生什麼?
- 30. 當popToRootViewController被調用時會發生什麼?
你能更具體嗎?在我看來,文檔談論得非常好:http://java.sun.com/javase/6/docs/api/java/lang/Thread。html#interrupt()我假設有些東西沒有說清楚,但是,如果你可以改進你的問題? – 2010-02-18 15:49:02