Java线程池ThreadPoolExecutor面试总结思维导图速记
优点
- 降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度,当任务到达时,可以不需要等待线程创建就能立即执行。
- 提高线程的可管理性
类关系
接 Executor 一个无返回值的execute方法
接 ExecutorService 返回值为Future类型的submit方法
类 AbstractExecutorService
类 ThreadPoolExecutor
创建
ThreadPoolExecutor类
包含参数
corePoolSize: 核心线程数最大值
maximumPoolSize: 最大线程数大小
keepAliveTime: 非核心线程空闲的存活时间大小
unit: 线程空闲存活时间单位
workQueue: 存放任务的阻塞队列
threadFactory: 用于设置创建线程的工厂
handler: 线城池的饱和策略事件
参数workQueue有如下几种队列
- ArrayBlockingQueue; 必须带参构造,数组,默认非公平可指定,FIFO
- LinkedBlockingQueue; 可带参构造,大小默认int最大,FIFO
- SynchronousQueue;不存储元素,每个插入操作必须等到另一个线程调用移除操作,否则堵塞
- PriorityBlockingQueue;优先级,数组
- DelayQueue; 基于PriorityQueue,延时阻塞队列,只有当其指定的延迟时间到了,才能够从队列中获取到该元素。
参数hander有如下几种
- AbortPolicy 丢弃任务并抛异常,默认
- DiscardPolicy 直接丢弃任务
- DiscardOldestPolicy 丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
- CallerRunsPolicy 由调用线程处理该任务
Executors类
阿里巴巴开发规范不允许使用Executors去创建,因为队列OOM。
主要有如下几种
- newCachedThreadPool():一个任务创建一个线程,使用SynchronousQueue,用于并发执行大量短期的小任务。
- newFixedThreadPool(nThreads):所有任务使用固定大小的线程池,使用LinkedBlockingQueue,适用执行长期的任务
- newSingleThreadExecutor():只有一个线程的线程池,使用LinkedBlockingQueue,适用于串行执行任务的场景,
执行流程
在 execute() 中实现,当提交一个线程时
- 如果正在运行的线程数 < coreSize,马上创建线程执行该task,不排队等待;
- 如果正在运行的线程数 >= coreSize,把该task放入队列;
- 如果队列已满 && 正在运行的线程数 < maximumPoolSize,创建新的线程执行该task;
4 . 如果队列已满 && 正在运行的线程数 >= maximumPoolSize,线程池调用handler的reject方法拒绝本次提交。
异常捕获
默认不捕获异常,捕获方法如下
- try-catch
- submit执行,Future.get接受异常
- 重写ThreadPoolExecutor的afterExecute方法,处理传递的异常引用
- 为工作者线程设置UncaughtExceptionHandler,在uncaughtException方法中处理异常
线程池状态
running
该状态的线程池会接收新任务,并处理阻塞队列中的任务;
- shutdown() -> shutdown
- shutdownNow() -> stop
shutdown
该状态的线程池不会接收新任务,但会处理阻塞队列中的任务;
- 队列为空,并且线程池中执行的任务也为空,进入tidying状态;
stop
该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务;
- 线程池中执行的任务为空,进入tidying状态;
tidying
该状态表明所有的任务已经运行终止,记录的任务数量为0。
- terminated() -> terminated
terminated
该状态表示线程池彻底终止
线程大小设置
- 如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 N(cpu) + 1
- 如果是IO密集型任务,参考值可以设置为2 * N(cpu)
思维导图(右键另存为下载)

喜欢可以点个赞,感谢!
Java线程池ThreadPoolExecutor面试总结思维导图速记的更多相关文章
- Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java线程池ThreadPoolExecutor使用和分析(一)
相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...
- Java线程池ThreadPoolExecutor类源码分析
前面我们在java线程池ThreadPoolExecutor类使用详解中对ThreadPoolExector线程池类的使用进行了详细阐述,这篇文章我们对其具体的源码进行一下分析和总结: 首先我们看下T ...
- [原创]Java性能优化权威指南读书思维导图
[原创]Java性能优化权威指南读书思维导图 书名:Java性能优化权威指南 原书名:Java performance 作者: (美)Charlie Hunt Binu John 译者: 柳飞 ...
- [原创]Java性能优化权威指南读书思维导图4
[原创]Java性能优化权威指南读书思维导图4
- [原创]Java性能优化权威指南读书思维导图3
[原创]Java性能优化权威指南读书思维导图3
- [原创]Java性能优化权威指南读书思维导图2
[原创]Java性能优化权威指南读书思维导图2
- java线程池ThreadPoolExecutor使用简介
一.简介线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为:ThreadPoolExecutor(int corePoolSize, int m ...
随机推荐
- [USACO11JAN]Roads and Planes G【缩点+Dij+拓补排序】
题目 Farmer John正在一个新的销售区域对他的牛奶销售方案进行调查.他想把牛奶送到T个城镇 (1 <= T <= 25,000),编号为1T.这些城镇之间通过R条道路 (1 < ...
- LeetCode62. 不同路径
由于机器人只可以向右和向下移动,所以我们要到第i行第j列,只可以由第i-1行第j列和第i行第j-1列移动一步得到,因此要到第i行第j列的方案数就是到第i-1行第j列的方案数和到第i行第j-1列的方案数 ...
- JavaScript基础对象创建模式之模块模式(Module Pattern)(025)
模块模式可以提供软件架构,为不断增长的代码提供组织形式.JavaScript没有提供package的语言表示,但我们可以通过模块模式来分解并组织 代码块,这些黑盒的代码块内的功能可以根据不断变化的软件 ...
- python 类中方法总结 --- 实例方法、类方法、静态方法
在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...
- 手写SpringMVC框架(一)-------项目搭建
SpringMVC处理请求的大致流程: 我们来开始着手手写一个SpringMVC框架. 新建一个springMVC项目,流程参见 SpringMVC框架搭建流程 引入servlet相关的jar包: & ...
- Python3笔记017 - 4.2 列表
第4章 序列的应用 python的数据类型分为:空类型.布尔类型.数字类型.字节类型.字符串类型.元组类型.列表类型.字典类型.集合类型 在python中序列是一块用于存放多个值的连续内存空间. py ...
- HDU 2236 无题Ⅱ
HDU 2236 无题Ⅱ 题目大意 这是一个简单的游戏,在一个\(n*n\)的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小. solution 暴枚\(i ...
- 最简单的博弈论——HDU - 5963 朋友 (博弈)
OK,好的先看一下题意: B君在围观一群男生和一群女生玩游戏,具体来说游戏是这样的: 给出一棵n个节点的树,这棵树的每条边有一个权值,这个权值只可能是0或1. 在一局游戏开始时,会确定一个节点作为根. ...
- HDU 3911 Black and White (线段树,区间翻转)
[题目地址] vjudge HDU [题目大意] 海滩上有一堆石头. 石头的颜色是白色或黑色. 小肥羊拥有魔术刷,她可以改变连续石的颜色,从黑变白,从白变黑. 小肥羊非常喜欢黑色,因此她想知道范围 ...
- electron代码审计
解包 Electron跨平台程序破解https://www.52pojie.cn/thread-563895-1-1.html Electron封装的跨平台程序破解的一般思路: 安装npm(至于如何安 ...