[并发编程] - Executor框架#ThreadPoolExecutor源码解读02
文章目錄
- Pre
- 線程池的具體實現
- 線程池的創建
- 參數解讀
- corePoolSize
- maximumPoolSize
- keepAliveTime
- unit
- workQueue
- threadFactory
- handler
- 任務提交
- 方式一 提交任務無返回值
- 方式二 提交任務有返回值
- 線程池監控
Pre
Java-Java中的線程池原理分析及使用
[并發編程] - Executor框架#ThreadPoolExecutor源碼解讀01
線程池的具體實現
主要兩大類
今天我們主要來看 ThreadPoolExecutor
線程池的創建
構造函數如上
找個參數最多的講解下
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {....}參數解讀
corePoolSize
線程池中的核心線程數,當提交一個任務時,線程池創建一個新線程執行任務,直到當前線程數等于corePoolSize;
舉個例子,假設corePoolSize=5 , 第一個任務過來以后,會創建一個核心線程,第一個任務執行結束了,現在池子里有1個線程。 這時候第二個任務來的時候,不會用原來的這個空閑的線程,線程池還是會繼續創建核心線程。
如果當前線程數為corePoolSize,繼續提交的任務被保存到阻塞隊列中,等待被執行
如果執行了線程池的prestartAllCoreThreads()方法,線程池會提前創建并啟動所有核心線程。
maximumPoolSize
線程池中允許的最大線程數。如果當前阻塞隊列滿了,且繼續提交任務,則創建新的線程執行任務,前提是當前線程數小于maximumPoolSize;
maximumPoolSize = 核心線程數 + 非核心線程數
keepAliveTime
線程池維護線程所允許的空閑時間。當線程池中的線程數量大于corePoolSize的時候,如果這時沒有新的任務提交,核心線程外的線程不會立即銷毀,而是會等待,直到等待的時間超過了keepAliveTime;
unit
keepAliveTime的單位;
workQueue
用來保存等待被執行的任務的阻塞隊列,且任務必須實現Runable接口。
在JDK中提供了如下阻塞隊列:
吐量通常要高于ArrayBlockingQuene;
另一個線程調用移除操作,否則插入操作一直處于阻塞狀態,吞吐量通常要高于LinkedBlockingQuene;
threadFactory
它是ThreadFactory類型的變量,用來創建新線程。默認使用Executors.defaultThreadFactory() 來創建線程。
使用默認的ThreadFactory來創建線程時,會使新創建的線程具有相同的NORM_PRIORITY優先級并且是非守護線程,同時也設置了線程的名稱。
handler
線程池的飽和策略,當阻塞隊列滿了,且沒有空閑的工作線程,如果繼續提交任務,必須采取一種策略處理該任務,線程池提供了4種策略:
上面的4種策略都是ThreadPoolExecutor的內部類.
當然也可以根據應用場景實現RejectedExecutionHandler接口,自定義飽和策略,如記錄日志或持久化存儲不能處理的任務.
任務提交
方式一 提交任務無返回值
public void execute() //提交任務無返回值方式二 提交任務有返回值
public Future<?> submit() //任務執行完成后有返回值線程池監控
public long getTaskCount() //線程池已執行與未執行的任務總數 public long getCompletedTaskCount() //已完成的任務數 public int getPoolSize() //線程池當前的線程數 public int getActiveCount() //線程池中正在執行任務的線程數量(大致數量,不一定準確)總結
以上是生活随笔為你收集整理的[并发编程] - Executor框架#ThreadPoolExecutor源码解读02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [并发编程] - Executor框架#
- 下一篇: Spring5源码 - 构建源码环境