您好,登錄后才能下訂單哦!
1. interrupt知識點
以下總結基于JDK8
本文不會完整說明interrupt,只會羅列一些比較重要的點。完整了解Thread.interrupt可以看參考資料。
以下的一些理解新的有助于理解參考資料的文章:
interrupt方法調用后,針對BLOCKED狀態的線程,只是設定中斷標志位為true。是否響應中斷(感知這個標志位的變化)取決于API的設計。JDK的阻塞IO API、Synchronized同步塊、還有Lock中的很多方法(不包括lockInterruptibly)都是不響應中斷的。當然調用線程可以利用標志位判斷來使得自己設計的API是可響應中斷的。
interrupt方法調用后,針對WAITING/TIMED_WAITING狀態的線程,會上拋interruptedException**并且設置中斷標志位false**。例如線程調用Thread.sleep,Object.wait()之后。
如果線程尚未啟動(NEW),或者已經結束(TERMINATED),則調用interrupt()對它沒有任何效果,中斷標志位也不會被設置。
最佳實踐:有時候一些方法設計上不允許被中斷或者取消,但是當別的線程發來中斷請求的時候,也需要進行標記的保留,方便其他調用方“了解情況”
public Task getNextTask(BlockingQueue<Task> queue) { boolean interrupted = false; try { while (true) { try { return queue.take(); } catch (InterruptedException e) { //fianlly中依賴的狀態標記 interrupted = true; // fall through and retry } } } finally { if (interrupted) //在fianlly中重新標記,確保沒有丟失中斷通知 Thread.currentThread().interrupt(); } }
利用中斷可以實現一些cancel的操作。例如:
package concurrent; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by wanshao * Date: 2017/12/18 * Time: 下午3:42 **/ public class InterruptExample { public static void main(String[] args) throws InterruptedException { InterruptTask interruptTask = new InterruptTask(); ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(interruptTask); Thread.sleep(100); interruptTask.cancel(); executorService.shutdown(); } } /** * 一個響應中斷的任務 */ class InterruptTask implements Callable<Integer> { private BlockingQueue<Task> queue; //保存要被interrupt的線程 Thread t; @Override public Integer call() throws InterruptedException { System.out.println("start a blocked task"); try { t = Thread.currentThread(); Thread.currentThread().sleep(50000); } catch (InterruptedException e) { System.out.println("be interrupted"); e.printStackTrace(); } return 0; } public void cancel() { System.out.println("cacel a task...."); //這里直接調用Thread.currentThread()會獲取到main線程,而不是線程池里面的線程 if (!t.isInterrupted()) { t.interrupt(); } } }
總結
以上所述是小編給大家介紹的基于JDK8總結java中的interrupt,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。