一.線程中斷 Java 中線程中斷是一種線程間協做模式,經過設置線程的中斷標誌並不能直接終止該線程的執行,而是須要被中斷的線程根據中斷狀態自行處理。 1.void interrupt() 方法:中斷線程,例如當線程 A 運行時,線程 B 能夠調用線程 A 的 interrupt() 方法來設置線程 A 的中斷標誌爲 true 並當即返回。設置標誌僅僅是設置標誌,線程 A 並無實際被中斷,會繼續往下執行的。若是線程 A 由於調用了 wait 系列函數或者 join 方法或者 sleep 函數而被阻塞掛起,這時候線程 B 調用了線程 A 的 interrupt() 方法,線程 A 會在調用這些方法的地方拋出 InterruptedException 異常而返回。 2.boolean isInterrupted():檢測當前線程是否被中斷,若是是返回 true,否者返回 false,代碼以下: public boolean isInterrupted() { //傳遞false,說明不清除中斷標誌 return isInterrupted(false); } 3.boolean interrupted():檢測當前線程是否被中斷,若是是返回 true,否者返回 false,與 isInterrupted 不一樣的是該方法若是發現當前線程被中斷後會清除中斷標誌,而且該函數是 static 方法,能夠經過 Thread 類直接調用。另外從下面代碼能夠知道 interrupted() 內部是獲取當前調用線程的中斷標誌而不是調用 interrupted() 方法的實例對象的中斷標誌。 public static boolean interrupted() { //清除中斷標誌 return currentThread().isInterrupted(true); } 下面看一個線程使用 Interrupted 優雅退出的經典使用例子,代碼以下: public void run(){ try{ .... //線程退出條件 while(!Thread.currentThread().isInterrupted()&& more work to do){ // do more work; } }catch(InterruptedException e){ // thread was interrupted during sleep or wait } finally{ // cleanup, if required } }