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

点击上方 蓝色字体 ,选择“标星公众号”
优质文章,第一时间送达
640?wx_fmt=jpeg
来自 | 林冠宏
链接 |   juejin.im/post/5a28b37c6fb9a044fc44a103

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

本文适合:

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

不适合:

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

本文能给你的阅读回报

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


废话少说,我们开始。

默认构造函数
public ThreadPoolExecutor(	
    int corePoolSize,	
    int maximumPoolSize,	
    long keepAliveTime,	
    TimeUnit unit,	
    BlockingQueue<Runnable> workQueue,	
    ThreadFactory threadFactory,	
    RejectedExecutionHandler handler	
) 	
{	
    ....	
}
绝对易懂的构造方法参数讲解
640?wx_fmt=png
corePoolSize,maximumPoolSize,workQueue之间关系。
文字描述
1、当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
2、当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。
3、当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。
4、当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
5、当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。
6、当设置 allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收。

一般流程图

640?wx_fmt=png

newFixedThreadPool 流程图

public static ExecutorService newFixedThreadPool(int nThreads){	
    return new ThreadPoolExecutor(	
            nThreads,   // corePoolSize	
            nThreads,   // maximumPoolSize == corePoolSize	
            0L,         // 空闲时间限制是 0	
            TimeUnit.MILLISECONDS,	
            new LinkedBlockingQueue<Runnable>() // 无界阻塞队列	
        );	
}
640?wx_fmt=png

newCacheThreadPool 流程图

public static ExecutorService newCachedThreadPool(){	
    return new ThreadPoolExecutor(	
        0,                  // corePoolSoze == 0	
        Integer.MAX_VALUE,  // maximumPoolSize 非常大	
        60L,                // 空闲判定是60 秒	
        TimeUnit.SECONDS,	
        // 神奇的无存储空间阻塞队列,每个 put 必须要等待一个 take	
        new SynchronousQueue<Runnable>()  	
    );	
}
640?wx_fmt=png

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. 

4. 

5. 

6. 

640?wx_fmt=jpeg
喜欢文章,点个 在看   640?wx_fmt=jpeg
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值