Java基礎sleep與interrupt
interrupt用於向線程發終止通知信號,會影響該線程內部的中斷標誌位
當前線程本身不會因為interrupt而改變狀態,狀態的具體變化需要等待接收到中斷表示的程序的最終處理結果來判定。
調用interrupt不會中斷當前線程的運行,它只改變中斷標誌位。
若因調用sleep方法使線程處於阻塞態,這時調用interrupt方法會拋出InterruptedException,線程提前結束。
在拋出異常前會清理中斷標誌位,拋出異常後調用isInterrupted()是會返false。
可以通過中斷標誌位來安全終止線程
安全終止線程
先調用interrupt方法改變中斷標誌位
在run方法中用isInterrupted()來判斷
代碼如下:
public class SleepInterrupt {
public static void main(String[] args) {
Runner2 r = new Runner2();
r.start();
try
{
Thread.sleep(4000);
}catch (InterruptedException e) {
}
r.interrupt();
}
static class Runner2 extends Thread{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("---this is run---");
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
System.out.println("---catch interrupt---");
this.interrupt();
}
}
System.out.println("---end---");
}
}
}
拋出異常後調用isInterrupted()返會false,所以要終止線程,調用this.interrupt();
中斷標誌位變為true,線程不滿足運行條件結束運行。