Executors.newCachedThreadPool的底层源码浅析

简介: Executors.newCachedThreadPool的底层源码浅析

1、BG(背景)

《线程池好处和核心参数等面试必备》对线程池的优点以及核心参数等进行了全面的介绍。


从整体角度大致谈谈Executors.newCachedThreadPool这个函数。


2、JDK Code

关于线程池的核心参数请看背景中提到的那篇文章。



首先老规矩,上源码(ps:看美女)。


java.util.concurrent.Executors#newCachedThreadPool()

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/90735382

释给出了该方法的说明:


该方法的目的是创建一个线程池。


该线程池在前面的线程可用时将会重用之前的线程,否则则创建新的线程。


该线程池对执行短的异步任务性能提升很大。


调用execute函数如果之前构造的线程没有销毁(60s保活期,没任务超期销毁)则会重用之前的线程。


60秒内没被用过的线程将会被终止从线程池缓存中移除掉。


因此该线程池闲置时不会消耗任何资源。



我们发现调用了java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>)构造方法来构建ThreadPoolExecutor对象。


  public ThreadPoolExecutor(int corePoolSize,

                             int maximumPoolSize,

                             long keepAliveTime,

                             TimeUnit unit,

                             BlockingQueue<Runnable> workQueue) {

       this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,

            Executors.defaultThreadFactory(), defaultHandler);

   }

核心线程数为0,最大线程数为整数最大值,保活时间为60秒,工作队列为SynchronousQueue。


如果线程池中的线程数大于核心线程数且队列满了,且线程数小于最大线程数,则会创建新的线程。


maximumPoolSize 最大可以至Integer.MAX_VALUE,是高度可伸缩的线程池,如果达到这个上限,相信没有任何服务器能够继续工作,肯定会拋出OOM异常。


keepAliveTime 默认为60秒,工作线程处于空闲状态,则回收工作线程。如果任务数增加,再次创建出新线程处理任务。


   ----《码处高效Java开发手册》



这里设置保活时间是为了线程池中的线程尽可能得能够复用,即60s内如果有新任务进来,就先不要创建新线程了,先用之前的线程来执行任务。



这点和redis的key过期时间有相通之处,redis设置过期时间比如为60s,如果60s之内访问,则可以用到缓存,否则就无法使用缓存需要查数据库了。(类比学习)


另外可以了解一下Executors.defaultThreadFactory(),默认的线程工厂的源码,了解其命名规则。


依然上源码(ps: 你懂得)

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/90735382

相关文章
|
7月前
|
Java 开发者
告别单线程时代!Java 多线程入门:选继承 Thread 还是 Runnable?
【6月更文挑战第19天】在Java中,面对多任务需求时,开发者可以选择继承`Thread`或实现`Runnable`接口来创建线程。`Thread`继承直接但限制了单继承,而`Runnable`接口提供多实现的灵活性和资源共享。多线程能提升CPU利用率,适用于并发处理和提高响应速度,如在网络服务器中并发处理请求,增强程序性能。不论是选择哪种方式,都是迈向高效编程的重要一步。
49 2
|
6月前
|
Java 开发者
Java并发编程之Executor框架详解
【7月更文挑战第18天】本文旨在深入探讨Java中的Executor框架,揭示其对并发编程的优化作用。通过解析Executor接口、ThreadPoolExecutor和ScheduledExecutorService等关键组件,文章展示了如何有效管理和控制线程资源。同时,结合实例分析,本文阐释了Executor框架在提高程序性能、简化代码结构方面的实际应用价值。旨在为Java开发者提供并发编程的高级工具,帮助他们构建更加高效、稳定的多线程应用。
|
存储 Java 调度
【 Executor线程池原理与源码】
【 Executor线程池原理与源码】
|
存储 Java C++
ThreadPoolExecutor 线程池执行流程及核心源码分析
ThreadPoolExecutor 线程池执行流程及核心源码分析
110 0
|
Java
[并发编程] - Executor框架#ThreadPoolExecutor源码解读03
[并发编程] - Executor框架#ThreadPoolExecutor源码解读03
75 0
|
存储 监控 Java
[并发编程] - Executor框架#ThreadPoolExecutor源码解读02
[并发编程] - Executor框架#ThreadPoolExecutor源码解读02
121 0
|
监控 安全 Java
[并发编程] - Executor框架#ThreadPoolExecutor源码解读01
[并发编程] - Executor框架#ThreadPoolExecutor源码解读01
105 0
|
存储 缓存 Java
【并发编程】线程池及Executor框架
【并发编程】线程池及Executor框架
|
缓存 Java 调度
JUC系列学习(一):线程池Executor框架及其实现ThreadPoolExecutor
`Executor` 框架将任务的提交与任务的执行**解耦**了。
Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理
170 0
Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理