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

溫馨提示×

溫馨提示×

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

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

java線程池對象ThreadPoolExecutor的深入講解

發布時間:2020-09-08 12:17:10 來源:腳本之家 閱讀:148 作者:大雨如注 欄目:編程語言

使用線程池的好處

1、降低資源消耗

可以重復利用已創建的線程降低線程創建和銷毀造成的消耗。

2、提高響應速度

當任務到達時,任務可以不需要等到線程創建就能立即執行。

3、提高線程的可管理性

線程是稀缺資源,如果無限制地創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一分配、調優和監控

ThreadPoolExecutor 介紹:

java 提供的線程池類;

ThreadPoolExecutor 作用:

兩個作用:

1,用于分離執行任務和當前線程;

2,主要設計初衷:重復利用Thread 對象;

ThreadPoolExecutor 使用:

實例化:

public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue) {
  this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
    Executors.defaultThreadFactory(), defaultHandler);
 }

這是ThreadPoolExecutor的構造方法之一,傳入參數最少,以下是參數說明:

corePoolSize  : 設置線程池的線程核心數量;該參數作用:當向線程池中添加的任務數量小于核心數量時,線程池將優先創建新的線程,而不是重用之前已存在的線程(不管該線程可用與否);

源碼佐證,ThreadPoolExecutor 的 execute(Runnable) 方法中有源碼如下:

java線程池對象ThreadPoolExecutor的深入講解

maximumPoolSize : 設置線程池可創建最大線程數量;該參數作用:用于限制線程池無限制的創建線程;

源碼佐證,ThreadPoolExecutor 的 addWorker(Runnable ,boolean) 方法中有源碼如下:

java線程池對象ThreadPoolExecutor的深入講解

keepAliveTime  : 設置線程池被創建線程的存活時間;

源碼佐證,ThreadPoolExecutor 的 getTask()方法中有源碼如下;源碼說明:創建的線程將從任務隊列中獲取一個新的任務,在keepAliveTime時間之后如果還未獲取到任務,將關閉該線程;

java線程池對象ThreadPoolExecutor的深入講解 

unit :設置線程池線程存活時間的時間單位;

workQueue :設置線程池用于存放任務的隊列;

注意:ThreadPoolExecutor線程池是否創建新的線程不僅僅依賴于corePoolSize變量,還依賴于任務隊列的offer(E) 方法所返回的值;比如:想要創建一個cache線程池,就依賴于一個特殊的任務隊列:SynchronousQueue<E>;

源碼佐證,ThreadPoolExecutor 的execute(Runnable) 方法中有源碼如下:

java線程池對象ThreadPoolExecutor的深入講解

示例: 創建固定線程池 和 cache線程池;

固定線程池,將corePoolSize 和 maximumPoolSize 設置相同即可,在Executors.newFixedThreadPool(10)有源碼示例:

 public static ExecutorService newFixedThreadPool(int nThreads) {
  return new ThreadPoolExecutor(nThreads, nThreads,
          0L, TimeUnit.MILLISECONDS,
          new LinkedBlockingQueue<Runnable>());
 }

cacahe線程池,需要傳入特殊的BlockingQueue對象,該對象需要在offer是返回false,并能夠在poll方法中監聽到offer進入的任務;java 提供了一個SynchronousQueue類,該類就是這樣一個對象;在Executors.newCachedThreadPool()方法中,有源碼示例:

 public static ExecutorService newCachedThreadPool() {
  return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
          60L, TimeUnit.SECONDS,
          new SynchronousQueue<Runnable>());
 }

常用方法提示:

  void execute(Runnable command) : 任務提交方法;線程池將順序執行所提交的所有方法;

  void shutdown() : 停止后續任務提交,但執行完當前線程池中所有任務;該方法的作用:線程池將中斷當前所有空閑的線程,但不保證一定中斷(可查看Thread的interrupt方法);那么工作中的線程將繼續工作,直到完成;

源碼:

public void shutdown() {
  final ReentrantLock mainLock = this.mainLock;
  mainLock.lock();
  try {
   checkShutdownAccess();
   advanceRunState(SHUTDOWN);
   interruptIdleWorkers(); 、//中斷所有空閑的線程
   onShutdown(); // hook for ScheduledThreadPoolExecutor
  } finally {
   mainLock.unlock();
  }
  tryTerminate();
 }

  List<Runnable> shutdownNow() : 立即終止線程池;該方法的作用:線程池將中斷所有創建的線程,但不保存一定中斷;線程池將所有剩余的任務從任務隊列中移除,不在執行,并保存在一個List中返回給用于;

方法源碼:

public List<Runnable> shutdownNow() {
  List<Runnable> tasks;
  final ReentrantLock mainLock = this.mainLock;
  mainLock.lock();
  try {
   checkShutdownAccess();
   advanceRunState(STOP);
   interruptWorkers();
   tasks = drainQueue();
  } finally {
   mainLock.unlock();
  }
  tryTerminate();
  return tasks;
 }

ThreadPoolExecutor 任務執行流程圖:

java線程池對象ThreadPoolExecutor的深入講解  

ThreadPoolExecutor 使用注意點說明:

清晰需要使用的是那種類型的線程池,在實例化ThreadPoolExecutor時,傳入的參數不同創建出來的線程池也將不同;尤其注意傳入BlockingQueue參數,如果需要使用cache線程池,請確保BlockingQueue的offer方法反回false;可以參見SynchronousQueue類;

總結:

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

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

AI

余干县| 甘德县| 堆龙德庆县| 宝坻区| 万州区| 图们市| 盱眙县| 清原| 英吉沙县| 什邡市| 南丰县| 环江| 伊川县| 灵丘县| 临沧市| 孝昌县| 静海县| 南丰县| 香格里拉县| 鄱阳县| 上思县| 鄂温| 彩票| 松阳县| 横峰县| 绥芬河市| 洛阳市| 鹿邑县| 田林县| 泰和县| 高邮市| 灯塔市| 大庆市| 凤山市| 保山市| 秭归县| 桐乡市| 长顺县| 横峰县| 彭阳县| 柳州市|