我有 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 中的任务,因为那些已经完成的任务将位于队列的末尾。
编辑:正如评论中所讨论的,在非常繁忙的系统上使用调度程序的 fixedRate
或 fixedDelay
功能时,稍后添加的任务可能会执行频率低于之前添加的任务,因为系统在决定运行下一个任务时似乎更喜欢已经执行的任务。
相比之下,我上面的解决方案可以正确地循环这些任务,尽管不能保证在繁忙的系统上所请求的延迟是准确的。因此它们可能会稍后执行,但至少总是按照 FIFO 顺序。
关于java - N 个重复任务的多线程架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21676713/