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

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

本文适合:

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

不适合:

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

本文能给你的阅读回报

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


废话少说,我们开始。

默认构造函数

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 流程图

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

newCacheThreadPool 流程图

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

newSingleThreadPool 流程图

public static ExecutorService newSingleThreadExecutor() {returnnew 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

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

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

  1. Java多线程学习六:使用线程池比手动创建线程好在那里以及常用线程池参数的意义

    为什么要使用线程池 首先,回顾线程池的相关知识,在 Java 诞生之初是没有线程池的概念的,而是先有线程,随着线程数的不断增加,人们发现需要一个专门的类来管理它们,于是才诞生了线程池.没有线程池的时候 ...

  2. 多线程—线程池Executor框架及四种常用线程池

    池化技术应用:线程池.数据库连接池.http连接池等等. 池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 使用线程池的好处: 降低资源消耗:通过重复利用已创建的线程降低线程创建和 ...

  3. 文化袁探索专栏——线程池执行原理|线程复用|线程回收

    文化袁探索专栏--Activity.Window和View三者间关系 文化袁探索专栏--View三大流程#Measure 文化袁探索专栏--View三大流程#Layout 文化袁探索专栏--消息分发机 ...

  4. Java常用线程池-固定线程池使用

    Java常用线程池-固定线程池使用 固定线程池 固定线程池 在执行数据处理时不可避免的需要使用多线程进行数据处理,以此提高数据处理效率,降低处理时间.而线城池现在池容器对数据处理效率提升有举足轻重的作 ...

  5. 【Java 并发编程】线程池机制 ( 线程池执行任务细节分析 | 线程池执行 execute 源码分析 | 先创建核心线程 | 再放入阻塞队列 | 最后创建非核心线程 )

    文章目录 一.线程池执行任务细节分析 二.线程池执行 execute 源码分析 一.线程池执行任务细节分析 线程池执行细节分析 : 核心线程数 101010 , 最大小成熟 202020 , 非核心线 ...

  6. Java等线程池执行完所有任务后再执行主线程

    2019独角兽企业重金招聘Python工程师标准>>> 因为要定时往数据库插入上百万数据,插入完之后再修改另外一部分数据, 怎么在线程池执行完所有任务后再执行主线程呢 import ...

  7. SpringBoot - 使用ExecutorService线程池执行异步任务教程(以Runnable任务为例)

    有时我们的系统需要进行一些比较耗时的操作,比如用户注册后要调用邮件服务器给用户发送个邮件,又比如上传一个大数据量的 excel 并导入到数据库.如果后端的这些工作比较耗时,那么前台的页面便会一直处于等 ...

  8. java 线程池的使用_Java 使用线程池执行若干任务

    在执行一系列带有IO操作(例如下载文件),且互不相关的异步任务时,采用多线程可以很极大的提高运行效率.线程池包含了一系列的线程,并且可以管理这些线程.例如:创建线程,销毁线程等.本文将介绍如何使用Ja ...

  9. java 等待线程/线程池执行完毕

    1.单线程开始并执行完毕 当线程开始后,需要用到join的方法 不废话直接贴代码 public static void main(String args[]) {long begin = System ...

最新文章

  1. 使用 CocoaPods 给微信集成 SDK 打印收发消息
  2. linux下screen工具使用
  3. Winform中DataGridView绑定IList数据源后的排序
  4. ie6 select出现在浮动层上面的解决方法
  5. ios 支付宝支付 回调数据_iOS逆向支付宝
  6. jQuery页面滚动图片等元素动态加载实现
  7. [译]响应式编程笔记一:响应式总览
  8. java项目需求文档,干货整理
  9. 百望系统网络配置服务器地址,各省百旺参数设置服务器地址
  10. linux 查看java_opts_Linux Tomcat 设置 JAVA_OPTS 异常
  11. 苹果开发者账号申请教程
  12. 如何计算乘积 java_Java模拟计算机的整数乘积计算功能示例
  13. C7N新增,保存,删除基础模板
  14. java redis 通知_Jboot实现Redis操作事件通知
  15. VScode恢复删除的文件
  16. PTA平台—数据结构(李详):顺序表参考答案
  17. linux下限制每个IP网速
  18. 碧山计划对乡土遗产保护的启示
  19. 淘宝商品详情查询V1新版接口
  20. host ntrip 千寻rtk_【千寻新姿势】南方工程之星5.0连接千寻FindCM服务设置教程

热门文章

  1. php 设置excel格式,php 操作excel文件的方法小结
  2. java ee监听器编程,java EE开发之Servlet第四课:监听器(Listener)
  3. php yaf smarty,Yaf 结合用户自定义的视图(模板)引擎Smarty(Yaf + Smarty)
  4. 从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素
  5. [Swagger2]配置Swagger
  6. C++ class实现顺序栈(完整代码)
  7. 使用单项循环链表实现字典操作(算法导论第十章10.2-5题)
  8. 海外服务器维护,海外服务器运行不正常的原因是什么?
  9. 二叉树先序,中序,后序,层次遍历(数据结构)
  10. 常系数齐次线性递推学习笔记