使用用户sjlee
在Impossible to make a cached thread pool with a size limit?
使用代码
new ThreadPoolExecutor(100, // core size
10000, // max size
1000, // idle timeout
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(Integer.MAX_SIZE)); // queue with a size
如果有超过coreSize
100 * queueSize
个20个任务,则线程数将增加,直到达到最大大小。
行。
但问题是,让我们说一切都已完成,没有更多的任务,线程的数量也不会减少。
如何让Executor在空闲时将线程数减少到0?
接下来,如何使Executor将额外内容队列以后运行?
答案 0 :(得分:1)
您可以使用allowCoreThreadTimeOut(true)
来执行核心线程在超时时终止。
答案 1 :(得分:0)
使用用户sjlee在这里给出的答案不可能制作一个大小限制的缓存线程池?
我不确定你是否完全理解你所链接的答案。它指出,除了核心线程之外,唯一的方法是队列是否已满。因此,如果我们查看您的代码:
new ThreadPoolExecutor(100, // core size
10000, // max size
1000, // idle timeout
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(Integer.MAX_SIZE)); // queue with a size
这意味着除非您真正将2 ^ 31-1个任务排入线程池,否则永远不会启动第101个线程。我不认为你真的应该开始10,000线程,但这是另一个问题。
如果有超过coreSize 100 * queueSize 20任务,则线程数将增加,直到达到最大大小。
我不确定20号的来源。在您的代码中,队列大小为Integer.MAX_SIZE
,因此在启动核心大小的其他线程之前,您必须排队超过Integer.MAX_SIZE
。
但问题是,让我们说一切都已完成,没有更多的任务,线程的数量也不会减少。
线程数将减少到核心线程数。正如@debaicai所提到的,您可以设置threadPool.allowCoreThreadTimeOut(true)
以使核心线程也超时。另外,1秒似乎是一个相当低的超时数,但也许这对你的应用程序有意义。
接下来,如何使Executor将额外内容队列以后运行?
额外的?那么你当然应该考虑将阻塞队列的大小限制在更合理的范围内。您可能需要查看我的growing a thread pool before enqueuing解决方案。