我检查了文档,没有参数来指定使用cachedthreadpool时的线程数,这是否意味着在重负载之前线程数会增加,直到系统资源用完为止?
答案 0 :(得分:0)
虽然我不确定它会消耗所有资源,但它是无限的(好吧,除非你可以启动Integer.MAX_VALUE
个线程)。它仍将重用线程并尽可能删除未使用的线程。但是,您可以自己使用构造函数:
ExecutorService myPool = new ThreadPoolExecutor(0, 30, //30 thread cap
60L, TimeUnit.SECONDS, //thread expiration time
new LinkedBlockingDeque<>(), //infinite queue, can use other synchronous collections
r -> new Thread(r, /* thread name */)); //thread factory
答案 1 :(得分:0)
newCachedThreadPool
背后的想法是创建短期线程,以便可以重用相同的线程而不是创建新线程。
仍然假设存在线程数等于Integer.MAX_VALUE
的情况;但仍有可用的CPU核心数量为4。
根据下面提到的代码:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
newCachedThreadPool()
方法在内部创建一个新的ThreadPoolExecutor
,maximumPoolSize
为Integer.MAX_VALUE
,keepAlive
时间为60秒。
keepAlive
的javadoc建议:
keepAliveTime 当线程数大于核心时,这是多余空闲线程在终止之前等待新任务的最长时间。
这意味着如果线程数超过可用的CPU核心数,那么多余的线程将在标记为终止之前仅存活60秒。
因此,不应存在newCachedThreadPool()
导致系统资源被完全消耗的任何此类情况。