每乙個執行緒都有乙個boolean屬性,表示中斷狀態,初始值為false。
正常情況下,只是將執行緒的中斷狀態變為true
。執行緒中可以通過輪詢中斷狀態,做出相應的處理。
如果執行緒在阻塞狀態下,執行緒將退出阻塞且中斷狀態將被清除
(即為false),且會丟擲interruptexception。
(io操作忽略)
(1)isinterrupted(),返回當前的中斷狀態,不會改變中斷狀態。
(2)static interrupted(),返回當前中斷狀態,且會清除中斷狀態。(即第二次呼叫將返回 false)
(1)繼續丟擲。
如果丟擲interruptedexception意味著是乙個阻塞方法,那麼呼叫乙個阻塞方法則意味著呼叫者也是乙個阻塞方法,應該有某種策略來處理interruptedexception。
(2)捕獲interruptedexception,執行清理
,再重新丟擲interruptedexception。
(3)再次呼叫interrupt()。
當由runnable定義的任務呼叫乙個可中斷的方法時,在這種情況下,不能重新丟擲interruptedexception,因為runnable介面的run方法不允許丟擲異常。
當乙個阻塞方法檢測到中斷並丟擲interruptedexception但是不能重新丟擲它,那麼應該保留中斷發生的證據,以便呼叫棧中更高層的**能知道中斷,並對中斷做出響應
,該任務可以通過呼叫interrupt()以重新中斷當前執行緒來完成。
public void run()
}catch (interruptedexception e)
}
如乙個io類會阻塞執行緒,但不支援中斷。則可以寫乙個新io類,繼承thread類,重寫interrupt方法,在interrupt中關閉io,最後呼叫super.interrupt();
在進入阻塞前被中斷,被稱為待決中斷。
在呼叫阻塞方法時,會立刻丟擲interruptexception。
參考文章:多執行緒-interrupt(),isinterrupted(),interrupted() - 小路不懂2
Java的Interrupt與執行緒中斷
每乙個執行緒都有乙個boolean屬性,表示中斷狀態,初始值為false。正常情況下,只是將執行緒的中斷狀態變為true。執行緒中可以通過輪詢中斷狀態,做出相應的處理。如果執行緒在阻塞狀態下,執行緒將退出阻塞且中斷狀態將被清除 即為false 且會丟擲interruptexception。io操作忽...
JAVA執行緒的interrupt
interrupt 只是改變中斷狀態而已.interrupt 不會中斷乙個正在執行的執行緒。這一方法實際上完成的是,給受阻塞的執行緒丟擲乙個中斷訊號,這樣受阻執行緒就得以退出阻塞的狀態 更確切 的說,如果執行緒被 object.wait,thread.join 和thread.sleep 三種方法之...
JAVA執行緒的interrupt
interrupt 只是改變中斷狀態而已.interrupt 不會中斷乙個正在執行的執行緒。這一方法實際上完成的是,給受阻塞的執行緒丟擲乙個中斷訊號,這樣受阻執行緒就得以退出阻塞的狀態 更確切 的說,如果執行緒被 object.wait,thread.join 和thread.sleep 三種方法之...