JUC源码解析(3)----线程池之 newCachedThreadPool()

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

通过调用Executors类的静态newCachedThreadPool()方法可以获得缓存的线程池。

语法

ExecutorService executor = Executors.newCachedThreadPool();

Java

其中,

  • newCachedThreadPool()方法创建一个具有可扩展线程池的执行器。
  • 这样的执行者适合于发起许多短命的任务的应用程序。

《JUC源码解析(3)----线程池之 newCachedThreadPool()》

1、CachedThreadPool 的corePoolSize 被设置为0,即corePool 为空;maximumPoolSize 被设置为 Integer.MAX_VALUE,即2147483647,为无界的。把keepAliveTime 设置为60L,  意味着CachedThreadPool 中的空闲线程等待新任务的最长时间为60秒,空闲线程超过60秒后将会被终止。

2、CachedThreadPool 使用没有容量的 SynchronousQueue 作为阻塞队列;意味着,如果主线程提交任务的速度高于 maximumPool 中线程处理任务的速度时,CachedThreadPool 会不断创建新线程。极端情况下会创建过多的线程,耗尽 CPU 和内存资源。
3、newCachedThreadPool在没有任务执行时,当线程的空闲时间超过keepAliveTime,会自动释放线程资源,当提交新任务时,如果没有空闲线程,则创建新线程执行任务,会导致一定的系统开销。

所以,使用该线程池时,一定要注意控制并发的任务数,否则创建大量的线程可能导致严重的性能问题。

它的执行流程如下:

  1. 没有核心线程,直接向 SynchronousQueue 中提交任务
  2. 如果有空闲线程,就去取出任务执行;如果没有空闲线程,就新建一个
  3. 执行完任务的线程有 60 秒生存时间,如果在这个时间内可以接到新任务,就可以继续活下去,否则就拜拜

由于空闲 60 秒的线程会被终止,长时间保持空闲的 CachedThreadPool 不会占用任何资源。

CachedThreadPool 用于并发执行大量短期的小任务,或者是负载较轻的服务器。

    原文作者:JUC
    原文地址: https://blog.csdn.net/qingtian211/article/details/81868155
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞