- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
If there are more than corePoolSize but less than maximumPoolSize threads running, a new thread will be created only if the queue is full.
有没有办法让执行器优先创建新线程,直到达到最大值,即使有超过核心大小的线程,然后开始排队?如果队列达到其最大大小,任务将被拒绝。如果超时设置会在处理完繁忙的突发事件后启动并将线程减少到核心大小,那就太好了。我看到了更喜欢排队以允许节流的原因;然而,这种定制还允许队列主要充当尚未运行的任务列表。
最佳答案
无法使用 ThreadPoolExecutor
获得这种确切的行为。
但是,这里有几个解决方案:
考虑,
如果少于 corePoolSize
个线程正在运行,将为每个排队的项目创建一个新线程,直到 coorPoolSize
个线程正在运行。
只有当队列已满且正在运行的线程少于 maximumPoolSize
时,才会创建新线程。
因此,将 ThreadPoolExecutor 包装在一个监控项目排队速度的类中。然后,在提交许多项目时将核心池大小更改为更高的值。这将导致每次提交新项目时都会创建一个新线程。
提交突发完成后,需要再次手动减小核心池大小,以便线程自然超时。如果您担心繁忙突发会突然结束,导致手动方法失败,请务必使用 allowCoreThreadTimeout .
创建固定线程池,并allowCoreThreadTimeout
不幸的是,这会在低提交突发期间使用更多线程,并且在零流量期间不会存储任何空闲线程。
如果您有时间、需要和倾向,请使用第一种解决方案,因为它可以处理更广泛的提交频率,因此在灵 active 方面是更好的解决方案。
否则使用第二种解决方案。
关于java - ThreadPoolExecutor 的排队行为可自定义以更喜欢创建新线程而不是排队?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237737/
嘿。本周的一个教程,其中一个问题要求通过使用其他函数 formatLine 和 formatList 创建一个函数 formatLines,以格式化行列表。 我的代码是这样的; type Line =
我是一名优秀的程序员,十分优秀!