并发 - 如何使其排队而不是拒绝?

时间:2017-08-20 05:55:53

标签: java multithreading concurrency threadpool

使用用户sjleeImpossible 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将额外内容队列以后运行?

2 个答案:

答案 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解决方案。