通俗易懂,开发必备的线程池执行流程图
2019-08-16 12:40:33来源:博客园 阅读 ()
通俗易懂,开发必备的线程池执行流程图
作者:林冠宏
juejin.im/post/5a28b37c6fb9a044fc44a103
有时候花了大把时间去看一些东西却看不懂,是很 “ 蓝瘦 ” 的,花时间也是投资。
本文适合:
-
曾了解过线程池却一直模模糊糊的人
-
了解得差不多却对某些点依然疑惑的
不适合:
-
完全没看过的,建议你先去看看其他基础文章
-
看过,却忘得差不多了,建议你先去回顾下
本文能给你的阅读回报
-
适合的读者,尽可能让你彻底明白常用的线程池的知识相关点
-
不适合的读者,能有个不错的概念,神童另谈
废话少说,我们开始。下图,皆可自行保存,常常阅之。日久,根深蒂固
默认构造函数
public ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler
)
{
....
}
绝对易懂的构造方法参数讲解
文字描述
corePoolSize,maximumPoolSize,workQueue之间关系。
-
当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
-
当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。
-
当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。
-
当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
-
当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。
-
当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收。
一般流程图
newFixedThreadPool 流程图
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(
nThreads, // corePoolSize
nThreads, // maximumPoolSize == corePoolSize
0L, // 空闲时间限制是 0
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>() // 无界阻塞队列
);
}
newCacheThreadPool 流程图
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(
0, // corePoolSoze == 0
Integer.MAX_VALUE, // maximumPoolSize 非常大
60L, // 空闲判定是60 秒
TimeUnit.SECONDS,
// 神奇的无存储空间阻塞队列,每个 put 必须要等待一个 take
new SynchronousQueue<Runnable>()
);
}
newSingleThreadPool 流程图
public static ExecutorService newSingleThreadExecutor() {
return
new FinalizableDelegatedExecutorService
(
new ThreadPoolExecutor
(
1,
1,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory
)
);
}
可以看到除了多了个 FinalizableDelegatedExecutorService 代理,其初始化和 newFiexdThreadPool 的 nThreads = 1 的时候是一样的。
区别就在于:
-
newSingleThreadExecutor返回的ExcutorService在析构函数finalize()处会调用shutdown()
-
如果我们没有对它调用shutdown(),那么可以确保它在被回收时调用shutdown()来终止线程。
使用ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态,一般采用默认。
流程图略,请参考 newFiexdThreadPool,这里不再累赘。
最后
还有一个定时任务线程池ScheduledThreadPool
它用来处理延时或定时任务,不常用
推荐阅读(点击即可跳转阅读)
1. SpringBoot内容聚合
2. 面试题内容聚合
3. 设计模式内容聚合
4. Mybatis内容聚合
5. 多线程内容聚合
原文链接:https://www.cnblogs.com/javazhiyin/p/11364027.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? 2020-06-09
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
- 是时候了解下软件开发的生命周期了! 2020-06-06
- 终于有人把最适合学习算法的书单找出来了,面试必备! 2020-06-03
- 10 个牛逼的后台开源项目,接私活赚钱必备! 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash