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


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

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

  • 完全没看过的,建议你先去看看其他基础文章
  • 看过,却忘得差不多了,建议你先去回顾下
  • 适合的读者,尽可能让你彻底明白常用的线程池的知识相关点
  • 不适合的读者,能有个不错的概念,神童另谈
  • 废话少说,我们开始。下图,皆可自行保存,常常阅之。日久,根深蒂固

    默认构造函数

    
    

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

    文字描述

    corePoolSize,maximumPoolSize,workQueue之间关系。

  • 当线程池中线程数小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
  • 当线程池中线程数达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行 。
  • 当workQueue已满,且maximumPoolSize > corePoolSize时,新提交任务会创建新线程执行任务。
  • 当workQueue已满,且提交任务数超过maximumPoolSize,任务由RejectedExecutionHandler处理。
  • 当线程池中线程数超过corePoolSize,且超过这部分的空闲时间达到keepAliveTime时,回收这些线程。
  • 当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize范围内的线程空闲时间达到keepAliveTime也将回收。
  • 一般流程图

    newFixedThreadPool 流程图

    
    

    newCacheThreadPool 流程图

    
    

    newSingleThreadPool 流程图

    
    

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

    区别就在于:

  • newSingleThreadExecutor返回的ExcutorService在析构函数finalize()处会调用shutdown()
  • 如果我们没有对它调用shutdown(),那么可以确保它在被回收时调用shutdown()来终止线程。
  • 使用ThreadFactory,可以改变线程的名称、线程组、优先级、守护进程状态,一般采用默认。

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

    最后

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

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

    (完)

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2020年1月17日
    下一篇 2020年1月17日

    相关推荐