ThreadPoolExecutor 的排队行为是否可自定义,以优先创建新线程而不是排队?

Saa*_*aad 6 java java.util.concurrent threadpoolexecutor

ThreadPoolExecutor文档说

如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢对请求进行排队而不是添加新线程。


如果运行的线程数大于 corePoolSize 但小于 maxPoolSize,则仅当队列已满时才会创建新线程。

有没有办法让执行器更喜欢创建新线程,直到达到最大值,即使有超过核心大小的线程,然后开始排队?如果队列达到最大大小,任务将被拒绝。如果在处理繁忙突发后,超时设置能够启动并删除线程至核心大小,那就太好了。我明白了为什么更喜欢排队以便进行限制;然而,这种定制还允许队列主要充当尚未运行的任务列表。

Wil*_*son 6

无法通过ThreadPoolExecutor.

但是,这里有几个解决方案:

  1. 考虑,

    • 如果运行的线程数不足corePoolSize,则将为每个排队的项目创建一个新线程,直到coorPoolSize线程运行为止。

    • 仅当队列已满并且maximumPoolSize正在运行的线程少于时,才会创建新线程。

    因此,将 ThreadPoolExecutor 包装在一个类中,该类监视项目排队的速度。然后,当提交许多项目时,将核心池大小更改为更高的值。这将导致每次提交新项目时创建一个新线程。

    当提交突发完成后,需要再次手动减小核心池大小,以便线程自然超时。如果您担心繁忙突发可能突然结束,导致手动方法失败,请务必使用allowCoreThreadTimeout

  2. 创建固定线程池,并允许CoreThreadTimeout

    不幸的是,这在低提交突发期间使用更多线程,并且在零流量期间不存储空闲线程。

如果您有时间、需要和意愿,请使用第一个解决方案,因为它可以处理更广泛的提交频率,因此在灵活性方面是更好的解决方案。

否则使用第二个解决方案。