国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

基于JDK8總結java中的interrupt

2024-07-13 10:14:58
字體:
來源:轉載
供稿:網友

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()對它沒有任何效果,中斷標志位也不會被設置。

最佳實踐:有時候一些方法設計上不允許被中斷或者取消,但是當別的線程發來中斷請求的時候,也需要進行標記的保留,方便其他調用方“了解情況”

java;">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,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海晏县| 土默特右旗| 西丰县| 瓦房店市| 增城市| 峨山| 绩溪县| 阳西县| 柳河县| 靖远县| 杭锦旗| 铁岭市| 晋宁县| 平远县| 甘洛县| 宁远县| 依安县| 成都市| 阿拉善右旗| 渭源县| 获嘉县| 同仁县| 丁青县| 凌源市| 大港区| 杭锦后旗| 屏山县| 平谷区| 克拉玛依市| 玛多县| 那坡县| 桓仁| 宾川县| 高青县| 九龙城区| 沂水县| 咸宁市| 永德县| 聂荣县| 钟祥市| 鲁山县|