Java线程池执行流程图,简单易懂

点击关注公众号,利用碎片时间学习

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

本文适合:

  • 曾了解过线程池却一直模模糊糊的人

  • 了解得差不多却对某些点依然疑惑的

不适合:

  • 完全没看过的,建议你先去看看其他基础文章

  • 看过,却忘得差不多了,建议你先去回顾下

本文能给你的阅读回报

  • 适合的读者,尽可能让你彻底明白常用的线程池的知识相关点

  • 不适合的读者,能有个不错的概念,神童另谈

废话少说,我们开始。下图,皆可自行保存,常常阅之。日久,根深蒂固

默认构造函数

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

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

c8550d5c5b1c227da50f2b9ae0680519.png
图片

文字描述

corePoolSizemaximumPoolSizeworkQueue之间关系。

  • 当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。

  • 当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。

  • 当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。

  • 当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。

  • 当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。

  • 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收。

一般流程图

7743dda0842b16b088514b7258d233ab.png
图片

newFixedThreadPool 流程图

public static ExecutorService newFixedThreadPool(int nThreads){  
    return new ThreadPoolExecutor(  
            nThreads,   // corePoolSize  
            nThreads,   // maximumPoolSize == corePoolSize  
            0L,         // 空闲时间限制是 0  
            TimeUnit.MILLISECONDS,  
            new LinkedBlockingQueue<Runnable>() // 无界阻塞队列  
        );  
}
349ba46e36a30b55b651201ade606278.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>()    
    );  
}
ae383d9125daf2883f6dea29e75c735d.png
图片

newSingleThreadPool 流程图

public static ExecutorService newSingleThreadExecutor() {  
        return   
            new FinalizableDelegatedExecutorService  
                (  
                    new ThreadPoolExecutor  
                        (  
                            1,  
                            1,  
                            0L,  
                            TimeUnit.MILLISECONDS,  
                            new LinkedBlockingQueue<Runnable>(),  
                            threadFactory  
                        )  
                );  
    }

可以看到除了多了个 FinalizableDelegatedExecutorService 代理,其初始化和 newFiexdThreadPoolnThreads = 1 的时候是一样的。

区别就在于:

  • newSingleThreadExecutor返回的ExcutorService在析构函数finalize()处会调用shutdown()

  • 如果我们没有对它调用shutdown(),那么可以确保它在被回收时调用shutdown()来终止线程。

使用ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态,一般采用默认。

流程图略,请参考 newFiexdThreadPool,这里不再累赘。

最后

还有一个定时任务线程池ScheduledThreadPool

它用来处理延时或定时任务,不常用

来源:juejin.im/post/5a28b37c6fb9a044fc44a103

推荐:

主流Java进阶技术(学习资料分享)

f49c256f14f6dc9a35dcd8dfc4de3ca7.png

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值