每個線程都有一個保存中斷狀態的特殊標誌,它可以通過isInterrupted()
方法訪問。當有人中斷某個線程時,該標誌被設置爲true
。就這樣。直到由該線程執行的代碼檢查該標誌並且引發InterruptedException
或者如果可以退出線程執行,則不會發生真正的中斷。
標準庫中的許多用於阻止當前線程的方法實際上會不時檢查該標誌,並在發現標誌置位時拋出InterruptedException
。例如,Thread.sleep()
,Thread.join()
,Object.wait()
,Lock.lockInterruptibly()
和許多其他。因此,當你的線程週期性地檢查這個標誌或者被一些隱式檢查它的描述方法阻塞時,它是可中斷的。否則,它不是。
因此,具有空循環的線程不能被中斷,因爲它不檢查中斷狀態。但是,增加的中斷狀態檢查將解決這個問題:
while (!Thread.currentThread().isInterrupted()) { }
調用一個方法響應中斷也將工作:
try {
while (true) {
Thread.sleep(timeout);
}
} catch(InterruptedException e) {
// Do nothing, just let the thread exit
}
可能有多種原因,但他們都將屬於類別「下儘管取消請求,任務不會停止「。你的while-true循環將成爲衆多原因之一。 –
@ Erwin,他們有沒有規則\模式? – Jason
也可以取消哪些類型的任務,任何模式? – Jason