博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通俗易懂,各常用线程池的执行 流程图
阅读量:6855 次
发布时间:2019-06-26

本文共 2918 字,大约阅读时间需要 9 分钟。

作者:林冠宏 / 指尖下的幽灵

掘金:

博客:

GitHub :

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

本文适合:

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

不适合:

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

本文能给你的阅读回报

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

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

默认构造函数

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

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

参数名 作用
corePoolSize 队列没满时,线程最大并发数
maximumPoolSizes 队列满后线程能够达到的最大并发数
keepAliveTime 空闲线程过多久被回收的时间限制
unit keepAliveTime 的时间单位
workQueue 阻塞的队列类型
RejectedExecutionHandler 超出 maximumPoolSizes + workQueue 时,任务会交给RejectedExecutionHandler来处理

文字描述

corePoolSize,maximumPoolSize,workQueue之间关系。

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

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

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

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

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

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

一般流程图

1602fee11fcf165d?w=745&h=794&f=png&s=105

newFixedThreadPool 流程图

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

1602ff914d170169?w=700&h=624&f=png&s=752

newCacheThreadPool 流程图

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

1603006f3e0871c6?w=539&h=703&f=png&s=691

newSingleThreadPool 流程图

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

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

区别就在于:

  • newSingleThreadExecutor返回的ExcutorService在析构函数finalize()处会调用shutdown()
  • 如果我们没有对它调用shutdown(),那么可以确保它在被回收时调用shutdown()来终止线程。

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

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

最后

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

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

如果您认为这篇文章还不错或者有所收获,您可以通过扫描一下下面的支付宝二维码 打赏我一杯咖啡【物质支持】,也可以点击右下角的【推荐】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力

img_12e3f54d4d0f70f0eb14f20548e3d781.png

转载地址:http://ksfyl.baihongyu.com/

你可能感兴趣的文章
50.检测两个节点的包含关系
查看>>
Spring系列之二——Spring初体验
查看>>
【Web动画】SVG 线条动画入门
查看>>
ftp服务器搭建(离线安装vsftpd),配置
查看>>
RequestMapping_请求方式
查看>>
bootstrap-datetimepicker时间控件
查看>>
第三十九天
查看>>
linux内核驱动module_init解析(2)
查看>>
代码优化中 主窗口 问题 解决
查看>>
POJ1091 跳蚤
查看>>
DUBBO本地搭建及小案例 (转)
查看>>
RabbitMQ指南之二:工作队列(Work Queues)
查看>>
软件测试2019:第八次作业—— 缺陷管理(含缺陷管理工具的配置实验)
查看>>
Go:slice
查看>>
一个android应用开发的感悟
查看>>
Qt Clipboard剪贴板简单使用
查看>>
使用UIElement.AddHandler捕获已被处理的RoutedEvent
查看>>
12.21站立会议
查看>>
SQL server 统计数据库表数量和列出所有表名称
查看>>
遍历DOM树,过滤节点
查看>>