前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通俗易懂,常用线程池执行的-流程图

通俗易懂,常用线程池执行的-流程图

作者头像
搜云库技术团队
发布2019-10-17 17:18:15
8620
发布2019-10-17 17:18:15
举报
文章被收录于专栏:搜云库技术团队

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

本文适合:

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

不适合:

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

本文能给你的阅读回报

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


废话少说,我们开始。

默认构造函数
代码语言:javascript
复制
public ThreadPoolExecutor(    int corePoolSize,    int maximumPoolSize,    long keepAliveTime,    TimeUnit unit,    BlockingQueue<Runnable> workQueue,    ThreadFactory threadFactory,    RejectedExecutionHandler handler) {    ....}复制代码
绝对易懂的构造方法参数讲解
corePoolSize,maximumPoolSize,workQueue之间关系。
文字描述

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

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

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

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

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

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

一般流程图

newFixedThreadPool 流程图

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

newCacheThreadPool 流程图

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

newSingleThreadPool 流程图

代码语言:javascript
复制
public static ExecutorService newSingleThreadExecutor() {        return             new FinalizableDelegatedExecutorService                (                    new ThreadPoolExecutor                        (                            1,                            1,                            0L,                            TimeUnit.MILLISECONDS,                            new LinkedBlockingQueue<Runnable>(),                            threadFactory                        )                );    }复制代码

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

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

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

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

最后

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

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

原文:

juejin.im/post/5a28b37c6fb9a044fc44a103

干货文章转发起来,让大家一起学习

更多技术干货

100篇:搜云库技术团队,整理了一年的技术干货

我们来谈下高并发和分布式中的幂等处理

大型分布式系统中的缓存架构

美团面试经历,贡献出来一起学习

干货:MySQL索引与优化实践

微服务架构:搭建网站扫码登录的功能设计

技术变化那么快,学 Docker 看这篇就够了

一文看懂 MySQL 高性能优化技巧实践

分布式事务不理解?一次给你讲清楚

动画+原理+代码+优化,解读十大经典排序算法

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本文能给你的阅读回报
  • 默认构造函数
  • 绝对易懂的构造方法参数讲解
  • corePoolSize,maximumPoolSize,workQueue之间关系。
  • 文字描述
  • 一般流程图
  • newFixedThreadPool 流程图
  • newCacheThreadPool 流程图
  • newSingleThreadPool 流程图
  • 最后
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档