1

私は、数百のデバイスに関連付けられた数千のタスクを実行するアプリケーションに取り組んでおり、各タスクの実行開始までに 5 ミリ秒未満、完了までに平均 100 ミリ秒かかります。

条件は次のとおりです。

  1. 各デバイスは、一度に 1 つのタスクしか処理できません。たとえば、1 つのタスクは、後続のタスクが処理される前に、割り当てられたデバイスで実行を終了する必要があります。
  2. スケジューラは効率的でなければなりません。現在、特定のデバイスのワーク キューの処理には、そのタスクの合計よりも時間がかかります。

現在の実装の基本的な説明は次のとおりです。

各デバイスには、そのデバイスに関連付けられたタスクで満たされたワーク キューが含まれています。

タスクがキューに入れられると、そのデバイスの作業キューがグローバル実行キュー (キューのキュー) に配置されます。グローバル実行キューは、デバイスのタスク オブジェクトをデキューし、1 つを処理してから、グローバル実行キューの後ろにデバイス キューを配置するワーカー スレッドによって消費されます。その特定のデバイスが再びキューから取り出されると、ワーカー スレッドはタスクが完了したかどうかを確認し、完了した場合は次のタスクが実行されます。このプロセスは、すべてのデバイス キューからグローバル ランキュー内のタスクがなくなるまで続きます。

改善のための提案はありますか?私はこれを明確に述べましたか?そうでない場合はお知らせください。明確にするために最善を尽くします。

ご覧いただきありがとうございます。よろしく。

4

2 に答える 2

1

ExecutorCompletionServiceThreadPoolExecutorのようなものはどうですか。これにより、後続のジョブを送信するために使用できる完了時のコールバックと、スループットを向上させるために微調整できるエグゼキューターのマネージド スレッドプールが提供されます。

プロファイラーでコードを実行して、現在ブロックされているスレッドを確認することをお勧めします (プロデューサー デバイス スレッドになるようです)。YourKit Java Profilerをお勧めしますが、無料ではありません。

于 2010-09-02T08:40:22.903 に答える
0

設計の問題は、一度に 1 つのタスクしか実行されないことです。つまり、他のデバイスが使用されている間、デバイスはアイドル状態になります。

何百ものデバイスがあるため、これらのデバイスのそれぞれにスレッドを割り当てるのはおそらく良い考えではありませんが、スレッド プールを使用することは非常に有効です。

于 2010-09-02T08:46:59.547 に答える