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