gpt4 book ai didi

java - N 个重复任务的多线程架构

转载 作者:行者123 更新时间:2023-12-01 23:12:23 25 4
gpt4 key购买 nike

我有 N 个任务,每个任务都使用固定的线程池大小(通常小于 N)在其自己的特定延迟间隔(N)之后重复。

由于通常会出现线程短缺的情况,因此应优先执行不同的任务,而不是重复最近完成的任务。

我正在考虑使用带有 N 个嵌套 ScheduledThreadPoolExecutors 的外部 ThreadPoolExecutor。我不太确定如何以最优化的方式解决这个问题,因为每个类都维护自己的内部线程池。

最佳答案

除了使用 assylias 回答的 PriorityQueue 之外,您还可以通过一个简单的执行 ThreadPoolExecutor 和另一个 ScheduledExecutorService 在架构上解决这个问题,它将在给定的延迟后插入任务。

因此,每个任务都有执行 Runnable 和插入 Runnable,并且在成功执行后,会告诉 ScheduledExecutorService 在给定的延迟后运行插入 Runnable,然后将任务放回到 ThreadPoolExecutor 中。

作为代码:

// myExecutionTask
void run() {
doSomeWork();
scheduledExecutor.schedule(myInsertionRunnable, 1000, TimeUnit.MILLISECONDS);
}

// myInsertionRunnable
void run () {
threadPoolExecutor.execute(myExecutionTask);
}

实际上,这将自动循环 ThreadPoolExecutor 中的任务,因为那些已经完成的任务将位于队列的末尾。

编辑:正如评论中所讨论的,在非常繁忙的系统上使用调度程序的 fixedRatefixedDelay 功能时,稍后添加的任务可能会执行频率低于之前添加的任务,因为系统在决定运行下一个任务时似乎更喜欢已经执行的任务。

相比之下,我上面的解决方案可以正确地循环这些任务,尽管不能保证在繁忙的系统上所请求的延迟是准确的。因此它们可能会稍后执行,但至少总是按照 FIFO 顺序。

关于java - N 个重复任务的多线程架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676713/

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