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

标签 java multithreading scheduled-tasks threadpool executorservice

我有 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/

相关文章:

Maven 构建的 Java 格式字符串错误

java - java.util.ConcurrentModificationException 背后的原因

multithreading - 带有Qt的SQLite3中的“Database is locked”错误

java - 如何在 Linux 中终止和停止在应用程序外运行的 TimerTask

java - 在网络应用程序(war)中,我有一个配置文本文件。如何阻止网络访问呢?

java - 在android中显示希伯来语字符

java - 如何终止多线程中超时的任务?

node.js - 如何同步 Node 中的两个异步调用?

node.js - 使用计划作业向客户端发送推送消息

c# - 如何使用 C# 验证服务器上是否存在计划任务?