java - 帮助实现任务调度算法

标签 java priority-queue job-scheduling

我正在开发一个应用程序,其中有数千个任务相关联 有数百个设备,每个任务需要 < 5 毫秒才能开始执行,并且 平均需要 100 毫秒才能完成。

条件如下:

  1. 每个设备只能处理一个 一次执行一个任务,例如,一个任务必须在其分配的任务上完成运行 在处理后续任务之前设备。
  2. 调度程序应该高效。目前,处理给定设备的 工作队列花费的时间比其任务总和还要长。

以下是当前实现的基本描述:

每个设备都包含一个工作队列,其中充满了与 该设备。

当任务入队时,该设备的工作队列被放入 全局运行队列(队列的队列)。全局运行队列被工作线程消耗 它将设备的任务对象出队,处理一个,然后放置 位于全局运行队列后面的设备队列。当给定设备 再次出队,工作线程检查任务是否已完成, 如果是,则执行下一个任务。此过程持续进行,直到所有设备排队 全局运行队列中的任务已耗尽。

有什么改进建议吗?我已经说清楚了吗?如果没有,请告诉我,我会尽力澄清。

感谢您花时间查看此内容。问候。

最佳答案

ExecutorCompletionService这样的东西怎么样?与 ThreadPoolExecutor 一起。这为您提供了完成时的回调,您可以使用它来提交后续作业,以及执行器的托管线程池,您可以调整它以提高吞吐量。

我建议您通过探查器运行代码,以查看哪些线程当前正在阻塞(听起来像是您的生产者设备线程)。我可以推荐 YourKit Java Profiler ,但它不是免费的。

关于java - 帮助实现任务调度算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3624160/

相关文章:

java - 空 ArrayList 和带有 null 元素的 ArrayList 之间的区别?

java - JSP 名称参数作为字符串动态显示在同一 JSP 页面中

java - Eclipse Kura http 身份验证失败

java - 基于参数属性的 Mockito 返回值

algorithm - Dijkstra 算法 : Priority Queue vs. 双向链表的运行时间差异

c# - 使用优先级队列时工作线程性能降低

java - Scala 的 TreeSet 与 Java 的 TreeSet - 轮询?

multithreading - 将作业动态分配给一组共享资源上的处理器

java - 使用 cron4j 在特定日期/日期范围安排任务

networking - 限制 Condor 作业的调度 : one per physical machine