キューに入っているタスク(I、D、U)のクラスが3つあり、同じクラスのタスクを順番に処理する必要があります。できるだけ同時にタスクを実行したい。しかし、いくつかの制約があります。制約付き並列タスク実行の設計パターン
- UとDが同時に
- Uを実行することはできませんし、私は同時に実行することはできません
- I(n)は
Q完了した(N)Uが必要です。どのようなデザインパターンがこのクラスの問題に適していますか?
アプローチ1:タスクあたり 使用1スレッド、独自のキューを持つ各
は私が検討しています二つのアプローチがあります。各スレッドには同期開始フェーズがあり、開始条件を確認してから実行し、その後同期フェーズを同期します。これは良い並行性を提供することは容易にわかりますが、私の制約が正しく実装されていて、デッドロックしていないかどうかはわかりません。D_Thread { ...
while (task = D_Queue.take()) {
synchronized (State) { // start phase
waitForU();
State.setRunning(D, true);
}
run(task); // run phase
synchronized (State) { // stop phase
State.setRunning(D, false)
}
}
}
アプローチ2:あるいは、単一のディスパッチスレッドは、必要に応じて完了するために、現在スケジュールされたタスクを待って、ThreadPoolの中で実行状態、およびスケジュール・タスクを管理します。
あなたは第三の制約上、より詳しく説明してもらえますか? IとUは対になっていて、それぞれが対になったUを必要とするか、そのような対は存在しませんが、完成したIの数は完成Uの数よりも大きくすることはできませんか?または、他の何か? – Dialecticus
2)各クラスの時間コストはどのくらいですか?完了するまでにほぼ同じ時間がかかりますか? – Dialecticus
両方のビット。 U(n)は一種のキャッシュであり、U(n-1)U(n-2)を意味する。すぐに複数のプロセスを処理することが可能です。各操作には、関連する位置があります。 D(k)は実際にU(k)の要件を生成する。それらは例として意味されていた。私は人々にこの問題を完全に解決するよう求めているわけではありません。いくつかのデザインパターンをお勧めします。 – Justin