JDK併發包溫故知新系列(三)—— 線程的中斷

須要進行線程中斷的場景

  • 不少線程的運行模式是死循環,好比在生產者/消費者模式中,消費者主體就是一個死循環,它不停的從隊列中接受任務,執行任務,在中止程序時,咱們須要一種"優雅"的方法以關閉該線程。
  • 在一些用戶啓動的任務中,線程是用戶啓動的,好比手動啓動批次任務,在任務執行過程當中,用戶可能會但願取消該任務。
  • 在一些場景中,好比從第三方服務器查詢一個結果,咱們但願在限定的時間內獲得結果,若是得不到,咱們會但願取消該任務。
  • 有時,咱們會啓動多個線程作同一件事,好比相似搶火車票,咱們可能會讓多個好友幫忙從多個渠道買火車票,只要有一個渠道買到了,咱們會通知取消其餘渠道。

涉及的線程方法(Thread對象方法)

  • public boolean isInterrupted() 判斷線程中斷標誌位是否爲true
  • public void interrupt() 設置線程中斷標誌位爲true,但對於線程不一樣的狀態,不必定能設置成功。
  • public static boolean interrupted() 返回線程中斷標誌位,並清空。

線程對中斷的反應

分幾種狀況:服務器

RUNNABLE狀態-線程調用了start()方法,處於等待系統調度或在運行中

這種狀況下只設置中斷標誌位。多線程

WAITING/TIMED_WAITING-等待狀態

當調用以下方法時進入等待狀態,包括的方法有:線程

WATING:調用了鎖資源的wait方法,或調用了join方法。code

TIMED_WAITING:wait(long timeout),sleep(long millis),join(long millis)。(wait與sleep的區別:是否釋放鎖)。對象

拋出InterruptedException異常而且線程中斷標誌位被清空,針對此通常通常是交由上級處理,若但願線程中斷,在catch裏面執行清理工做或重設線程標誌位。隊列

BLOCKED-線程處於鎖等待隊列,試圖進入同步塊

只設置標誌位。資源

NEW/TERMINATED-線程結束了或還未調用start()方法

不會有任何效果。同步

注意

不是說調用了interrupt()方法,線程就終止了,須要線程實現者經過代碼實現,以下:it

while (!Thread.currentThread().isInterrupted()) {
//清理邏輯
 }
相關文章
相關標籤/搜索