gpt4 book ai didi

java - ThreadPoolExecutor - ArrayBlockingQueue ... 在从队列中删除元素之前等待

转载 作者:行者123 更新时间:2023-11-29 04:00:32 27 4
gpt4 key购买 nike

我正在尝试调整执行以下操作的线程:

只有 1 个线程的线程池 [CorePoolSize =0, maxPoolSize = 1]

使用的队列是 ArrayBlockingQueue

问题 = 20

背景:
该线程尝试读取请求并对其执行操作。

但是,最终请求增加得如此之多以至于线程总是很忙并消耗 1 个 CPU,这使其成为资源消耗者。

我想做的是每隔一段时间对请求进行采样并处理它们。可以安全地忽略其他请求。

我要做的是在“操作”函数中 hibernate ,这样对于每个任务,线程都会 hibernate 一段时间并释放 CPU。

问题:
但是,我想知道是否有一种方法可以使用基本上在读取下一个元素之前本身会 hibernate 一段时间的队列。这将是理想的,因为在执行过程中 hibernate 任务并保持执行不完整对我来说听起来不是最好的。

如果您对任务还有其他建议,请告诉我

谢谢。

编辑:我已经添加了一个后续问题here将 maxpool 大小更正为 1 [匆忙写下] .. 感谢 tim 指出。

最佳答案

不,当线程在池中时,您不能让线程 hibernate 。如果队列中有任务,它将被执行。

在排队的任务中暂停是强制线程空闲的唯一方法,尽管有排队的任务。现在,“ sleep ”不必与“工作”在同一个任务中——您可以在每个真正的任务之后对一个单独的休息任务进行排队,这可能会使实现更清晰。更重要的是,如果工作是返回结果的Callable,则分成两个任务将使您尽快获得结果。

作为一种改进,您可以将执行“节流”到指定的速率,而不是在每个任务之间 hibernate 固定的时间间隔。这将允许您避免在任务之间不必要地等待,同时避免在指定的时间间隔内执行太多任务。你可以read another answer of mine了解使用 DelayQueue 实现这一点的简单方法。

关于java - ThreadPoolExecutor - ArrayBlockingQueue ... 在从队列中删除元素之前等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859987/

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