JUC - ThreadPoolExecutor
JUC - ThreadPoolExecutor
创建一个ThreadPoolExecutor
ThreadPoolExecutor(
int corePoolSize, // 保留在池中的线程数,即使空闲了也保留(除非设置了{@code allowCoreThreadTimeOut})
int maximumPoolSize, // 池中允许的最大线程数
long keepAliveTime, // 当maximumPoolSize>corePoolSize时,多余空闲线程等待任务的时间
TimeUnit unit, // {@code keepAliveTime}参数的时间单位
BlockingQueue<Runnable> workQueue, // 在task执行之前暂存task.队列只接纳被 {@code execute}方法提交的{@code Runnable}task
ThreadFactory threadFactory, // 创建执行task线程的工厂
RejectedExecutionHandler handler // 如果达到线程界限或者队列容量,拒绝任务执行的处理
)
参数限制
- 满足以下条件之一则抛出IllegalArgumentException
- corePoolSize < 0
- keepAliveTime < 0
- maximumPoolSize <= 0
- maximumPoolSize < corePoolSize
- 抛出NullPointerException
- threadFactory == null
- handler == null
参数补充说明
- corePoolSize : 如果当前线程总数小于
corePoolSize
,则新建的是核心线程,如果超过corePoolSize
,则新建的是非核心线程 - keepAliveTime : 指该线程池中非核心线程闲置超时时长, 超过这个参数所设定的时长,就会被销毁掉, 如果设置
allowCoreThreadTimeOut = true
,则会作用于核心线程 - unit : TimeUnit时间
- maximumPoolSize : 线程总数 = 核心线程数 + 非核心线程数
- workQueue : 当核心线程都在工作时,新添加的任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行任务
- ArrayBlockingQueue : 构造函数一定要传大小
- LinkedBlockingQueue : 构造函数不传大小会默认为
Integer.MAX_VALUE
,当大量请求任务时,容易造成内存耗尽.由于这个队列没有最大值限制,即所有超过核心线程数的任务都将被添加到队列中,这也就导致了maximumPoolSize的设定失效,因为总线程数永远不会超过corePoolSize - SynchronousQueue : 同步队列,一个没有存储空间的阻塞队列 ,将任务同步交付给工作线程.此队列通常要求无界 maximumPoolSizes 以避免拒绝新提交的任务
- PriorityBlockingQueue : 优先队列
- DelayQueue : 传进去的任务必须先实现Delayed接口。这个队列接收到任务时,首先先入队,只有达到了指定的延时时间,才会执行任务
- threadFactory : 线程工厂(默认值
Executors.defaultThreadFactory()
) - handler : 拒绝策略
- AbortPolicy(默认) : 直接抛弃
- CallerRunsPolicy : 拒绝这个任务,不在ThreadPoolExecutor线程池中的线程中运行,而是调用当前线程池的所在的线程去执行被拒绝的任务
- DiscardOldestPolicy : 抛弃队列中最久的任务(最先加入队列的任务),再把这个新任务添加到队列中去。
- DiscardPolicy : 线程池默默丢弃这个被拒绝的任务,不会抛出异常。
执行过程
- 1.当线程池小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
- 2.当线程池达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
- 3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
- 4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
- 5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
- 6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
Executors中常见的ThreadPoolExecutor
- 单个线程池: Executors.newSingleThreadExecutor() || Executors.newSingleThreadExecutor(ThreadFactory threadFactory)
- new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()) - new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(),
threadFactory) - 创建单个线程
- new ThreadPoolExecutor(1, 1,
- 固定线程池: Executors.newFixedThreadPool(int nThreads) || Executors.newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
- new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()) - new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(),
threadFactory); - 核心线程和最大线程相同,并且不过期
- new ThreadPoolExecutor(nThreads, nThreads,
- 缓存线程池: Executors.newCachedThreadPool() || Executors.newCachedThreadPool(ThreadFactory threadFactory)
- new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue()) - new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue(),
threadFactory) - 核心线程为0,并且阻塞队列为SynchronousQueue,按需创建线程,默认过期时间60s
- new ThreadPoolExecutor(0, Integer.MAX_VALUE,
- 调度线程池: Executors.newScheduledThreadPool(int corePoolSize) || Executors.newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)
- new ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE,
0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue()) - new ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE,
0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue(),
threadFactory) - 可以调度命令以在给定延迟后运行或定期执行
- new ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE,
- 窃取线程池: Executors.newWorkStealingPool() || Executors.newWorkStealingPool(int parallelism)
- new ForkJoinPool
(Runtime.getRuntime().availableProcessors(),
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true); - new ForkJoinPool
(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true) - 窃取线程是ForkJoinPool的拓展(分治算法),创建一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行,适合很耗时间的任务
- new ForkJoinPool
参考阅读
- Java Thread Pool – ThreadPoolExecutor Example
- ThreadPoolExecutor – Java Thread Pool Example
- Java 多线程(5):Fork/Join 型线程池与 Work-Stealing 算法
JUC - ThreadPoolExecutor的更多相关文章
- 【JUC】JDK1.8源码分析之ThreadPoolExecutor(一)
一.前言 JUC这部分还有线程池这一块没有分析,需要抓紧时间分析,下面开始ThreadPoolExecutor,其是线程池的基础,分析完了这个类会简化之后的分析,线程池可以解决两个不同问题:由于减少了 ...
- JUC 之 ThreadPoolExecutor 的一些研究
ThreadPoolExecutor 概述:===================================================================== 构造函数: 4个 ...
- Java - "JUC线程池" ThreadPoolExecutor原理解析
Java多线程系列--“JUC线程池”02之 线程池原理(一) ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存 ...
- juc线程池原理(二):ThreadPoolExecutor的成员变量介绍
概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...
- JUC - Monitor监控ThreadPoolExecutor
JUC - Monitor监控ThreadPoolExecutor 一个自定义Monitor监控ThreadPoolExecutor的执行情况 TASK WokerTask class WorkerT ...
- JUC源码分析-线程池篇(一):ThreadPoolExecutor
JUC源码分析-线程池篇(一):ThreadPoolExecutor Java 中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.在开发过程中,合理地使用线程池 ...
- 硬核干货:4W字从源码上分析JUC线程池ThreadPoolExecutor的实现原理
前提 很早之前就打算看一次JUC线程池ThreadPoolExecutor的源码实现,由于近段时间比较忙,一直没有时间整理出源码分析的文章.之前在分析扩展线程池实现可回调的Future时候曾经提到并发 ...
- JUC回顾之-ThreadPoolExecutor的原理和使用
Spring中的ThreadPoolTaskExecutor是借助于JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的.基于ThreadPoolEx ...
- JUC线程池之 ThreadPoolExecutor简介
ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许若个线程同时允许,允许同 ...
随机推荐
- S905系列的uboot分析
Ubuntu18.04通过PL2303HX连接TTL 接线的连接 PL2303的3.3V悬空, TX接盒子RX, RX接盒子TX, GND接盒子GND 终端选择 系统自带pl2303的驱动, 可以通过 ...
- C++中rapidxml用法
转载:https://www.cnblogs.com/rainbow70626/p/7586713.html 解析xml是第三方库很多,例如:tingxml,这次学习一下rapidxml,rapidx ...
- Java基础 awt Frame 设置窗体的大小 位置 可见性
JDK :OpenJDK-11 OS :CentOS 7.6.1810 IDE :Eclipse 2019‑03 typesetting :Markdown code ...
- Java8相关底层
Java8是往并行方向走的.由面向对象到函数式编程. 在支持函数式编程的同时还可以支持面向对象的开发. 在JDK1.8里面,接口里面可以有实现方法的!默认方法,default.实现这个接口. 接口里面 ...
- 泡泡一分钟:Geometric and Physical Constraints for Drone-Based Head Plane Crowd Density Estimation
张宁 Geometric and Physical Constraints for Drone-Based Head Plane Crowd Density Estimation 基于无人机的向下平面 ...
- 两分钟观看 nodejs、 iojs、 npmjs 之间的狗血剧情
开门大吉,欢迎光临.这是 乐玩nodejs npm工具库 微信公众号的第一篇文章,那就先来说说 nodejs/npm 的小秘密,话不多说,赶快开始: 通过一个时间线简要描述下 2008 年 V8 引擎 ...
- api-doc-php
主要功能: 根据接口注释自动生成接口文档 演示地址 [Gitee Pages:]http://itxq.gitee.io/api-doc-php 开源地址: [GigHub:]https://gith ...
- 自动生成LR脚本且运行
背景:作为一个测试,特别是性能测试,尤其在活动的测试,时间紧,有很多要测的,我们的LR11因为浏览器兼容问题全录制不了脚本了,用浏览器加代理或手机加代理录制,我感觉好麻烦 ,所以就想如果能用脚本把所有 ...
- 开发日记:Windows进程守护工具
近期,中心应用服务无故关闭.在检查系统和应用程序日志无果后采取了进程守护的方法.测试期内,脚本未出现系统资源占用过多的情况. 使用说明:1.进程守护.vbs 使用时需修改运行周期(10行).守护进程 ...
- 共享和独享IP的VPS的区别?
共享IP的VPS主机: 顾名思义,共享IP的VPS主机的最大特性即是若干VPS主机用户共享同一个公网IP地址,此目的显然是节省有限的IP地址资源,有效应对Ipv4枯竭的问题.其基本原理是,所有VPS主 ...