当前位置: 移动技术网 > IT编程>开发语言>Java > 通俗易懂,开发必备的线程池执行流程图

通俗易懂,开发必备的线程池执行流程图

2019年08月16日  | 移动技术网IT编程  | 我要评论

作者:林冠宏

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. 

2. 

3. 

4. 

5. 

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网