91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于JDK8總結java中的interrupt

發布時間:2020-09-08 05:07:42 來源:腳本之家 閱讀:165 作者:Blog of Kami Wan 欄目:編程語言

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

马公市| 黄骅市| 汕头市| 宝清县| 巴彦淖尔市| 德庆县| 连云港市| 镇坪县| 大新县| 渭南市| 雷波县| 漳平市| 镇沅| 灵川县| 沁水县| 于田县| 沾化县| 额济纳旗| 随州市| 汽车| 朔州市| 玉环县| 阆中市| 永平县| 墨江| 高碑店市| 大关县| 富蕴县| 饶阳县| 新乐市| 元阳县| 绥德县| 读书| 潮安县| 垣曲县| 台南县| 三穗县| 颍上县| 迁安市| 巧家县| 闽侯县|