天天看點

線程響應中斷

首先介紹下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部落格

簡書部落格

公衆号:代碼小搬運

線程響應中斷

繼續閱讀