關于java中的interrupt
來自: http://my.oschina.net/u/2250599/blog/617327
一、概念
java中線程有開始,運行(就緒,運行),阻塞,等待,終止這幾種狀態。其中在等待的時候可以通過設置中斷標志位來喚醒線程。一般情況下等待狀態的線程檢查到中斷標志被置位,則會拋出InterruptedException異常,捕獲異常,復位中斷標志,可以使線程繼續運行。
thread.interrupt() 設置中斷標識位
Thread.interrupt() 回復中斷標識位
thread.isInterrupted() 返回中斷標識位
什么情況下可以使用Interrunpt
(1)如果線程在調用 Object 類的 wait()、wait(long) 或 wait(long, int) 方法,或者該類的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法過程中受阻,則其中斷狀態將被清除,它還將收到一個InterruptedException異常。這個時候,我們可以通過捕獲InterruptedException異常來終止線程的執行,具體可以通過return等退出或改變共享變量的值使其退出。
(2)如果該線程在可中斷的通道上的 I/O 操作中受阻,則該通道將被關閉,該線程的中斷狀態將被設置并且該線程將收到一個 ClosedByInterruptException。這時候處理方法一樣,只是捕獲的異常不一樣而已。
二、代碼
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.getStackTrace());
System.out.println("thread is interrupt ? >>> " + Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt();
System.out.println("thread is interrupt ? >>> " + Thread.currentThread().isInterrupted());
}
}
});
thread.start();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
}
thread.interrupt();
}
輸出結果:
[Ljava.lang.StackTraceElement;@1e0c386d
thread is interrupt ? >>> false
thread is interrupt ? >>> true