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