zoukankan      html  css  js  c++  java
  • 通俗易懂,开发必备的线程池执行流程图

    作者:林冠宏

    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. SpringBoot内容聚合

    2. 面试题内容聚合

    3. 设计模式内容聚合

    4. Mybatis内容聚合

    5. 多线程内容聚合

  • 相关阅读:
    extjs使用笔记-21
    如何安装整个linux系统中所需要的mp3播放库插件? 可以在安装rpmfusion仓库后直接通过dnf install进行按照就可以了
    aria2的下载配置
    再谈fedora23下Virutalbox的安装. --问题的关键在于 安装kernel-devel包
    extjs的使用笔记2
    提高迅雷的下载速度
    extjs的使用笔记
    expr的字符串操作 表达式: length, index, match, substr等
    弄懂linux shell对包含$的变量的执行过程?
    从0开始安装fedora23的笔记-- 以及使用fedora的常规问题-3
  • 原文地址:https://www.cnblogs.com/javazhiyin/p/11364027.html
Copyright © 2011-2022 走看看