1

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

条件如下:

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

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

每个设备都包含一个工作队列,其中填充了与该设备相关的任务。

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

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

感谢您抽出宝贵时间查看此内容。问候。

4

2 回答 2

1

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

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

于 2010-09-02T08:40:22.903 回答
0

您的设计的问题是一次只运行一个任务,这意味着任何设备都处于空闲状态,而任何其他设备都在使用中。

由于有数百个设备,因此为每个设备分配一个线程可能不是一个好主意,但可以很好地使用线程池。

于 2010-09-02T08:46:59.547 回答