首先介紹下Thread的兩個方法:
- interrupt():設定目前中斷标記為true
- isInterrupted():檢查線程的中斷标記
@Slf4j
public class StopThread implements Runnable {
public static void main(String[] args) throws InterruptedException {
Thread thread =new Thread(new StopThread());
thread.start();
log.debug("main Thread");
thread.interrupt();
log.debug("調用interrupt後是否中斷" + thread.isInterrupted());
log.debug("調用interrupt後thread是否存活:" + thread.isAlive());
Thread.sleep(1000);
log.debug("Thread end後是否中斷:" + thread.isInterrupted());
log.debug("Thread end後是否存活:" + thread.isAlive());
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
log.debug("i = "+i);
}
log.debug("Thread end");
}
}
輸出:
i = 1
i = 2
....
i = 6
main Thread
i = 7
...
i = 9
調用interrupt後是否中斷true
i = 10
調用interrupt後thread是否存活:true
Thread end
Thread end後是否中斷:false
Thread end後是否存活:false
由輸出我們可以看出執行Thread.interrupt()方法,并不是中斷線程,隻是改變其标志位,如果需要通過标志位來達到中斷線程的要求,将Runable改為:
@Override
public void run() {
for (int i = 1; i <= 10 && !Thread.currentThread().isInterrupted(); i++) {
log.debug("i = "+i);
}
log.debug("Thread end");
}
輸出:
i = 1
main Thread
i = 2
Thread end
調用interrupt後是否中斷true
調用interrupt後thread是否存活:false
Thread end後是否中斷:false
Thread end後是否存活:false
通過檢查線程中斷标志位來終止線程。
更多文章:
CSDN部落格
簡書部落格
公衆号:代碼小搬運