通俗易懂,常用线程池执行的-流程图

点击上方
蓝色字体
,选择“标星公众号”
优质文章,第一时间送达


通俗易懂,常用线程池执行的-流程图
来自 | 林冠宏
链接 |
 
juejin.im/post/5a28b37c6fb9a044fc44a103


有时候花了大把时间去看一些东西却看不懂,是很 “ 蓝瘦 ” 的,花时间也是投资。

本文适合:

曾了解过线程池却一直模模糊糊的人 了解得差不多却对某些点依然疑惑的

不适合:

完全没看过的,建议你先去看看其他基础文章 看过,却忘得差不多了,建议你先去回顾下

本文能给你的阅读回报

适合的读者,尽可能让你彻底明白 常用的线程池的知识相关点 不适合的读者,能有个不错的概念,神童另谈


废话少说,我们开始。

默认构造函数

public ThreadPoolExecutor(    int corePoolSize,    int maximumPoolSize,    long keepAliveTime,    TimeUnit unit,    BlockingQueue<Runnable> workQueue,    ThreadFactory threadFactory,    RejectedExecutionHandler handler) {    ....}

绝对易懂的构造方法参数讲解

通俗易懂,常用线程池执行的-流程图

corePoolSize,maximumPoolSize,workQueue之间关系。

文字描述

1、当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2、当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。
3、当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。
4、当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
5、当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。
6、当设置 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 的时候是一样的。区别就在于:
1、newSingleThreadExecutor返回的ExcutorService在析构函数finalize()处会调用shutdown() 2、如果我们没有对它调用shutdown(),那么可以确保它在被回收时调用shutdown()来终止线程。
使用 
ThreadFactory
,可以改变线程的名称、线程组、优先级、守护进程状态,一般采用默认。
流程图略,请参考 newFiexdThreadPool,这里不再累赘。

最后

还有一个定时任务线程池 
ScheduledThreadPool
它用来处理延时或定时任务,不常用

如果喜欢本篇文章,欢迎转发、点赞。关注订阅号「Web项目聚集地」,回复「全栈」即可获取 2019 年最新 Java、Python、前端学习视频资源。


推荐阅读

1. 这代码写的,狗屎一样 

2. 这代码写的,狗屎一样 (下)

3. 除了负载均衡,Nginx 还可以做很多

4. 快来薅当当的羊毛 !

5. 聊一聊 Java 泛型中的通配符

6. 数据库不使用外键的 9 个理由

通俗易懂,常用线程池执行的-流程图
喜欢文章,点个
在看
 
通俗易懂,常用线程池执行的-流程图

本文分享自微信公众号 - Java后端(web_resource)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

版权声明:程序员胖胖胖虎阿 发表于 2022年9月1日 上午4:56。
转载请注明:通俗易懂,常用线程池执行的-流程图 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...