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

Java 并发-如何使其排队而不是拒绝?,java,multithreading,concurrency,threadpool,Java,Multithreading,Concurrency,Threadpool,在这里使用用户给出的答案 使用代码 new ThreadPoolExecutor(100, // core size 10000, // max size 1000, // idle timeout TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(Integer.MAX_SIZE)); // queue with a size newthreadpoolexecutor(100,//核

在这里使用用户给出的答案

使用代码

new ThreadPoolExecutor(100, // core size
    10000, // max size
    1000, // idle timeout
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<Runnable>(Integer.MAX_SIZE)); // queue with a size
newthreadpoolexecutor(100,//核心大小
10000,最大尺寸
1000,//空闲超时
TimeUnit.ms,
新建LinkedBlockingQueue(整数.MAX_SIZE));//按大小排队
如果有超过20个任务
coreSize
100*
queueSize
20个任务,线程数量将增加,直到达到最大大小

但是问题是,假设一切都完成了,没有更多的任务,线程的数量不会减少

如何使执行器在所有线程都处于空闲状态时将线程数减少到0


接下来,如何使执行器队列中的额外线程在以后运行?

您可以使用
allowCoreThreadTimeOut(true)
来实现核心线程将在超时时终止

在这里使用用户sjlee给出的答案不可能生成具有大小限制的缓存线程池

我不确定你是否完全理解了你链接到的答案。它指出,启动多个核心线程的唯一方法是队列已满。因此,如果我们查看您的代码:

new ThreadPoolExecutor(100, // core size
    10000, // max size
    1000, // idle timeout
    TimeUnit.MILLISECONDS,
    new LinkedBlockingQueue<Runnable>(Integer.MAX_SIZE)); // queue with a size
newthreadpoolexecutor(100,//核心大小
10000,最大尺寸
1000,//空闲超时
TimeUnit.ms,
新建LinkedBlockingQueue(整数.MAX_SIZE));//按大小排队
这意味着您永远不会启动第101个线程,除非您真的将2^31-1个任务排入线程池。我不认为你真的应该开始10000个线程,但这是另一个问题

如果有超过coreSize 100*queueSize 20个任务,线程数量将增加,直到达到最大大小

我不知道数字20来自哪里。在您的代码中,队列大小为
Integer.MAX_size
,因此在启动超过核心大小的其他线程之前,您必须排队超过
Integer.MAX_size

但是问题是,假设一切都完成了,没有更多的任务,线程的数量不会减少

线程数将减少到核心线程数。正如@debaicai提到的,您可以设置
线程池。allowCoreThreadTimeOut(true)
使核心线程也超时。顺便说一句,1秒似乎是一个相当低的超时数,但这对您的应用程序来说可能是有意义的

接下来,如何使执行器队列中的额外任务稍后运行


临时演员?当然,你应该考虑将阻塞队列的大小限制在更合理的范围内。您可能想看看我的解决方案。

阅读javadoc:keepAliveTime-当线程数大于核心时,这是多余空闲线程在终止新任务之前等待新任务的最长时间。我希望线程在全部空闲时减少到0。核心大小不能设置为1,因为这1个线程将只执行所有任务。为什么?线程将位于那里-不消耗任何资源。或者扔掉对遗嘱执行人的提及。然后所有的东西都会在某个时候被收集起来。