Thread.interrupt 的作用講解

Thread.stop, Thread.suspend, Thread.resume 已經被廢棄了。
而 Thread.interrupt 的作用其實也不是中斷線程,而是「通知線程應該中斷了」,
具體到底中斷還是繼續運行,應該由被通知的線程自己處理。

具體來說,當對一個線程,調用 interrupt() 時,
① 如果線程處於被阻塞狀態(例如處於sleep, wait, join 等狀態),那麼線程將立即退出被阻塞狀態,並拋出一個InterruptedException異常。僅此而已。
② 如果線程處於正常活動狀態,那麼會將該線程的中斷標誌設置爲 true,僅此而已。被設置中斷標誌的線程將繼續正常運行,不受影響。

interrupt() 並不能真正的中斷線程,需要被調用的線程自己進行配合纔行。
也就是說,一個線程如果有被中斷的需求,那麼就可以這樣做。
① 在正常運行任務時,經常檢查本線程的中斷標誌位,如果被設置了中斷標誌就自行停止線程。
② 在調用阻塞方法時正確處理InterruptedException異常。(例如,catch異常後就結束線程。)

Thread thread = new Thread(() -> {
    while (!Thread.interrupted()) {
        // do more work.
    }
});
thread.start();

// 一段時間以後
thread.interrupt();


具體到你的問題,Thread.interrupted()清除標誌位是爲了下次繼續檢測標誌位。
如果一個線程被設置中斷標誌後,選擇結束線程那麼自然不存在下次的問題,
而如果一個線程被設置中斷標識後,進行了一些處理後選擇繼續進行任務,
而且這個任務也是需要被中斷的,那麼當然需要清除標誌位了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章