newCachedThreadPool对于池中的线程号没有上限吗?

时间:2017-05-10 06:01:20

标签: java

我检查了文档,没有参数来指定使用cachedthreadpool时的线程数,这是否意味着在重负载之前线程数会增加,直到系统资源用完为止?

2 个答案:

答案 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()方法在内部创建一个新的ThreadPoolExecutormaximumPoolSizeInteger.MAX_VALUEkeepAlive时间为60秒。

keepAlive的javadoc建议:

  

keepAliveTime 当线程数大于核心时,这是多余空闲线程在终止之前等待新任务的最长时间。

这意味着如果线程数超过可用的CPU核心数,那么多余的线程将在标记为终止之前仅存活60秒。

因此,不应存在newCachedThreadPool()导致系统资源被完全消耗的任何此类情况。