如果我寫下如下代碼,我們不能中斷或終止線程。它也不會拋出InterruptedException。爲什麼InterruptedException僅從像sleep()和wait()這樣的阻塞方法中拋出異常?
Thread loop = new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
}
}
}
);
loop.start();
loop.interrupt();
要中斷這個線程,我需要如下修改我的代碼:
Thread loop = new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
if (Thread.interrupted()) {
break;
}
// Continue to do nothing
}
}
}
);
loop.start();
loop.interrupt();
我的問題是,
爲什麼Java的設計以這樣的方式,InterruptedException的只有在像sleep()和wait()這樣的阻塞方法的情況下才會被拋出。
爲什麼在普通代碼中,我們需要像上面的代碼片段那樣手動處理?爲什麼Java不會拋出InterruptedException,只要我們通過設置中斷標誌true爲interrupt()方法?
我已經閱讀了很多關於InterruptedException的博客和文章,但還沒有找到任何有說服力的答案。
編輯
發現好文章InterruptedException的:爪哇 http://codepumpkin.com/interruptedexception-java-multithreading/
如果在正常執行過程中代碼可能被中斷,那麼它將不得不在每一行代碼之間進行檢查,並且會很慢。此外,一些代碼要求它運行到完成,否則會產生不可預知的錯誤(例如不關閉資源)。 – 4castle
這基本上是停止使用的stop()方法所做的。你可以閱讀它在javadoc中被棄用的原因。但是4castle解釋得非常好。 –
Java中斷是*合作*。一個線程可以要求另一個線程停止正在進行的操作,但是不需要其他線程立即執行或者甚至執行任何操作。 –