美文网首页
通俗易懂,开发必备的线程池执行流程图

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

作者: xiaotian是个混子 | 来源:发表于2019-08-18 16:59 被阅读0次

作者:林冠宏

juejin.im/post/5a28b37c6fb9a044fc44a103

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

本文适合:

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

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

不适合:

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

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

本文能给你的阅读回报

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

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

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

默认构造函数

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

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

image

文字描述

corePoolSize,maximumPoolSize,workQueue之间关系。

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

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

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

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

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

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

一般流程图

image

newFixedThreadPool 流程图

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

newCacheThreadPool 流程图

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

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

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

相关文章

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

    作者:林冠宏juejin.im/post/5a28b37c6fb9a044fc44a103 有时候花了大把时间去看...

  • 阅读源码之线程池

    线程池流程图 更美观一点的如下图 核心类的构造函数如下 执行的核心代码 拒绝策略的执行时机一:当线程池不是运行中状...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • okhttp源码分析

    1. 项目结构 拦截器 连接池 线程池 2.执行流程图 2.1代码执行流程 2.2 正常流程 通道建立与安全dns...

  • 【Java并发编程】阿里最喜欢问的几道线程池的面试题?

    引言 上一篇文章我们有介绍过线程池的一个基本执行流程《【Java并发编程】面试必备之线程池》[https://mp...

  • 线程池 | 执行流程、拒绝策略

    线程池执行流程 想要真正的了解线程池的执行流程,就要先从线程池的执行方法execute()说起,execute()...

  • 线程池

    线程池种类 ThreadPoolExecutor 基础线程池 线程执行任务过程 当前执行线程数 < corePoo...

  • Java线程池策略

    Java线程池策略 线程池在Java开发中随处可见,其执行策略可以总结如下: 当提交一个新任务到线程池时: 判断核...

  • 并发 - Java中的线程池

    线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过...

  • 线程池源码分析

    线程池源码分析 在线程池执行任务的时候,都是主线程(可能是tomcat线程),将任务放到线程池中,再执行线程池的e...

网友评论

      本文标题:通俗易懂,开发必备的线程池执行流程图

      本文链接:https://www.haomeiwen.com/subject/ejzrsctx.html