gpt4 book ai didi

java - ThreadPoolExecutor 的排队行为可自定义以更喜欢创建新线程而不是排队?

转载 作者:搜寻专家 更新时间:2023-11-01 01:53:30 25 4
gpt4 key购买 nike

ThreadPoolExecutor医生说

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 获得这种确切的行为。

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

  1. 考虑,

    • 如果少于 corePoolSize 个线程正在运行,将为每个排队的项目创建一个新线程,直到 coorPoolSize 个线程正在运行。

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

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

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

  2. 创建固定线程池,并allowCoreThreadTimeout

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

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

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

关于java - ThreadPoolExecutor 的排队行为可自定义以更喜欢创建新线程而不是排队?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com