newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
通过调用Executors
类的静态newCachedThreadPool()
方法可以获得缓存的线程池。
语法
ExecutorService executor = Executors.newCachedThreadPool();
Java
其中,
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,会自动释放线程资源,当提交新任务时,如果没有空闲线程,则创建新线程执行任务,会导致一定的系统开销。
所以,使用该线程池时,一定要注意控制并发的任务数,否则创建大量的线程可能导致严重的性能问题。
它的执行流程如下:
- 没有核心线程,直接向
SynchronousQueue
中提交任务 - 如果有空闲线程,就去取出任务执行;如果没有空闲线程,就新建一个
- 执行完任务的线程有 60 秒生存时间,如果在这个时间内可以接到新任务,就可以继续活下去,否则就拜拜
由于空闲 60 秒的线程会被终止,长时间保持空闲的 CachedThreadPool
不会占用任何资源。
CachedThreadPool
用于并发执行大量短期的小任务,或者是负载较轻的服务器。