【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )
文章目錄
- 前言
- 一、ThreadPoolExecutor 構(gòu)造參數(shù)
- 二、newCachedThreadPool 參數(shù)分析
- 三、newFixedThreadPool 參數(shù)分析
- 四、newSingleThreadExecutor 參數(shù)分析
前言
在上一篇博客 【Java 并發(fā)編程】線(xiàn)程池機(jī)制 ( 線(xiàn)程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor ) 使用了 333 種類(lèi)型的線(xiàn)程池 , 333 種線(xiàn)程池都使用了 ThreadPoolExecutor , 該類(lèi)時(shí)線(xiàn)程池的核心 ;
本篇博客中分析這 333 種線(xiàn)程池 ;
一、ThreadPoolExecutor 構(gòu)造參數(shù)
ThreadPoolExecutor 是線(xiàn)程池中最核心的類(lèi) , 其構(gòu)造函數(shù)如下 :
public ThreadPoolExecutor(int corePoolSize, // 核心線(xiàn)程數(shù) , 這些線(xiàn)程基本不會(huì)被銷(xiāo)毀int maximumPoolSize, // 最大線(xiàn)程數(shù) , 線(xiàn)程池能創(chuàng)建的最大線(xiàn)程數(shù)量long keepAliveTime, // 空閑情況下 , 非核心線(xiàn)程存活時(shí)間TimeUnit unit, // 空閑時(shí)間單位BlockingQueue<Runnable> workQueue,// 任務(wù)的阻塞隊(duì)列ThreadFactory threadFactory, // 創(chuàng)建線(xiàn)程的工廠類(lèi)RejectedExecutionHandler handler) // 拒絕策略int corePoolSize 核心線(xiàn)程數(shù) , 這些線(xiàn)程基本不會(huì)被銷(xiāo)毀 ;
int maximumPoolSize 最大線(xiàn)程數(shù) , 線(xiàn)程池能創(chuàng)建的最大線(xiàn)程數(shù)量 , 包括 核心線(xiàn)程 + 非核心線(xiàn)程 ;
long keepAliveTime 空閑情況下 , 非核心線(xiàn)程存活時(shí)間 ;
TimeUnit unit 空閑時(shí)間單位 ;
BlockingQueue<Runnable> workQueue 任務(wù)的阻塞隊(duì)列 , 任務(wù)設(shè)置到線(xiàn)程池后 , 在該隊(duì)列中排隊(duì)等待執(zhí)行 ;
ThreadFactory threadFactory 創(chuàng)建線(xiàn)程的工廠類(lèi) ;
RejectedExecutionHandler handler 拒絕策略 , 如果線(xiàn)程池已滿(mǎn) , 如果再放入新的任務(wù)后的拒絕策略
二、newCachedThreadPool 參數(shù)分析
ExecutorService executorService1 = Executors.newCachedThreadPool(); 創(chuàng)建線(xiàn)程池代碼如下 :
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}分析上述代碼中 ThreadPoolExecutor 構(gòu)造函數(shù)參數(shù) :
核心線(xiàn)程數(shù) 000 , 沒(méi)有核心線(xiàn)程 ;
最大線(xiàn)程數(shù) Integer.MAX_VALUE , 值為 231?12^{31} - 1231?1 , 這些線(xiàn)程都是非核心線(xiàn)程 , 是無(wú)限大的 ; 注意這里有 OOM 風(fēng)險(xiǎn) ;
線(xiàn)程的存活時(shí)間 606060 秒 ;
使用的等待隊(duì)列是 SynchronousQueue<Runnable> 隊(duì)列 ;
SynchronousQueue 隊(duì)列不存儲(chǔ)元素 , 后一個(gè) Runnable 任務(wù)入隊(duì) , 必須等到前一個(gè)任務(wù)執(zhí)行完畢才可以 , 否則會(huì)一直阻塞等待 ;
使用該線(xiàn)程池 , 如果執(zhí)行 100000100000100000 個(gè) Runnable 任務(wù) , 則會(huì)創(chuàng)建 100000100000100000 個(gè)線(xiàn)程 , 與 【Java 并發(fā)編程】線(xiàn)程池機(jī)制 ( 測(cè)試線(xiàn)程開(kāi)銷(xiāo) | 啟動(dòng)線(xiàn)程分析 | 用戶(hù)態(tài) | 內(nèi)核態(tài) | 用戶(hù)線(xiàn)程 | 內(nèi)核線(xiàn)程 | 輕量級(jí)進(jìn)程 ) 一、測(cè)試線(xiàn)程開(kāi)銷(xiāo) 1、正常測(cè)試 章節(jié)測(cè)試 ;
- 首次創(chuàng)建 100000100000100000 線(xiàn)程 , 性能基本相同 , 只是添加了一個(gè)線(xiàn)程存活時(shí)間 ;
- 如果再次創(chuàng)建 100000100000100000 線(xiàn)程 , 此時(shí)線(xiàn)程池中的線(xiàn)程如果執(zhí)行完畢 , 可以復(fù)用之前創(chuàng)建的 100000100000100000 線(xiàn)程池 , 不用重新創(chuàng)建線(xiàn)程 ; 前提是期間沒(méi)有間斷 , 如果線(xiàn)程間斷超過(guò)了 " 非工作線(xiàn)程存活時(shí)間 " , 這些線(xiàn)程就會(huì)被銷(xiāo)毀 ;
三、newFixedThreadPool 參數(shù)分析
ExecutorService executorService2 = Executors.newFixedThreadPool(10); 創(chuàng)建線(xiàn)程池代碼如下 :
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}分析上述代碼中 ThreadPoolExecutor 構(gòu)造函數(shù)參數(shù) :
核心線(xiàn)程數(shù)是 nThreads , 這是傳入的參數(shù) ;
最大線(xiàn)程數(shù) nThreads , 核心線(xiàn)程數(shù)是 nThreads , 所有的線(xiàn)程都是核心線(xiàn)程 ;
非核心線(xiàn)程的存活時(shí)間 000 毫秒 ; 由于所有線(xiàn)程都是核心線(xiàn)程 , 設(shè)置非核心線(xiàn)程存貨事件意義不大 ;
使用的等待隊(duì)列是 LinkedBlockingQueue<Runnable> 隊(duì)列 ;
LinkedBlockingQueue 隊(duì)列是基于鏈表的阻塞隊(duì)列 , 該隊(duì)列吞吐量高于 ArrayBlockingQueue 隊(duì)列 , 低于 SynchronousQueue 隊(duì)列 ;
假設(shè)核心線(xiàn)程數(shù)為 101010 , 有 100100100 個(gè)任務(wù)需要執(zhí)行 ;
執(zhí)行 100100100 個(gè) Runnable 任務(wù) , 如果 101010 個(gè)核心線(xiàn)程沒(méi)有滿(mǎn) , 則將任務(wù)提交給核心線(xiàn)程執(zhí)行 ; 如果核心線(xiàn)程都滿(mǎn)了 , 則將 Runnable 任務(wù)放到 LinkedBlockingQueue<Runnable> 等待隊(duì)列 , 假如該等待隊(duì)列中任務(wù)也滿(mǎn)了 , 則需要執(zhí)行 RejectedExecutionHandler handler 拒絕策略 ;
該拒絕策略默認(rèn)是 defaultHandler ;
private static final RejectedExecutionHandler defaultHandler =new AbortPolicy();四、newSingleThreadExecutor 參數(shù)分析
ExecutorService executorService3 = Executors.newSingleThreadExecutor(); 創(chuàng)建線(xiàn)程池代碼如下 :
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}分析上述代碼中 ThreadPoolExecutor 構(gòu)造函數(shù)參數(shù) :
核心線(xiàn)程數(shù)是 111 , 只有 111 個(gè)核心線(xiàn)程 ;
最大線(xiàn)程數(shù) 111 , 核心線(xiàn)程數(shù)是 111 , 所有的線(xiàn)程都是核心線(xiàn)程 ;
非核心線(xiàn)程的存活時(shí)間 000 毫秒 ; 由于所有線(xiàn)程都是核心線(xiàn)程 , 設(shè)置非核心線(xiàn)程存貨事件意義不大 ;
使用的等待隊(duì)列是 LinkedBlockingQueue<Runnable> 隊(duì)列 ;
LinkedBlockingQueue 隊(duì)列是基于鏈表的阻塞隊(duì)列 , 該隊(duì)列吞吐量高于 ArrayBlockingQueue 隊(duì)列 , 低于 SynchronousQueue 隊(duì)列 ;
整個(gè)線(xiàn)程池只有 111 個(gè)核心線(xiàn)程在工作 ; 100100100 個(gè)任務(wù)在 LinkedBlockingQueue<Runnable> 任務(wù)隊(duì)列中排隊(duì)等待執(zhí)行 ;
總結(jié)
以上是生活随笔為你收集整理的【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Java 并发编程】线程池机制 ( 线
- 下一篇: 【Java 并发编程】线程池机制 ( 线