2012-08-14 42 views
3

如標題所示,我們是否需要強制jvm退出時得到InterruptedException?我問的原因是我有點困惑(Unix)中斷信號。當我們在運行java應用程序的同時鍵入Ctrl-C時,阻塞線程是否會得到InterruptedException?JVM是否需要退出時捕獲InterruptedException

所以要簡單,
1)何時和爲什麼InterruptedException被拋出?
2)當JVM從外部中斷或者死亡(如Unix命令)時,線程是否會中斷?

感謝

+0

本文可能會幫助您理解這種機制並找到答案:[您如何處理InterruptedException?](http://www.yegor256.com/2015/10/20/interrupted-exception.html) – yegor256 2015-10-22 20:11:54

回答

5

不,您一般不會退出JVM以響應InterruptedException

InterruptedException可能會在另一個線程調用其interrupt()方法後在一個線程中產生。它與硬件中斷或操作系統信號沒有任何關係。中斷是一種告訴線程停止正在執行的操作並以儘可能快的速度退出的方式,而不會使共享內存處於受損狀態。

線程只有在他們明確描述了他們如何響應中斷時才應被中斷。通常這將例如響應於像按下「取消」按鈕的用戶交互來完成。

通常,中斷只會影響單個線程,並且應用程序的其餘部分會繼續運行。不過,我可以設想在JVM中安裝一個信號處理程序,通過乾淨地關閉整個服務器來響應信號;這很可能會導致請求進程線程和其他線程的中斷。

+0

很清楚,很好的答案! – Alfred 2012-08-14 20:19:51

0

中斷的例外是不相關的JVM錯誤條件,它是什麼,當他們在事件的正常過程中喚醒(了Thread.interrupt()由)冬眠線程接收。

+1

線程不會休眠。他們通過調用'wait()'方法等待,但是當它們變爲可運行時沒有例外。還有一個不贊成的線程掛起設施,但它也沒有使用異常。 – erickson 2012-08-14 18:51:13

+0

中斷 public void interrupt() 中斷此線程。 首先調用此線程的checkAccess方法,這可能會導致拋出SecurityException。 如果此線程在調用Object類的wait(),wait(long)或wait(long,int)方法或join(),join(long),join(long, int),sleep(long)或sleep(long,int)這個類的方法,那麼它的中斷狀態將被清除,並且它將收到一個InterruptedException異常。 – ddyer 2012-08-14 19:22:28

+0

好的,我明白你現在得到了什麼。我專注於「在正常事件過程中」這個短語,但你真的在談論我忽視的異常事件過程 - 中斷。 – erickson 2012-08-14 21:03:17