Javaでタスク(依存および独立)を並行して実行する方法を見つける必要があります。
- タスク A とタスク C は独立して実行できます。
- タスク B は、タスク A の出力に依存しています。
java.util.concurrent Future と Fork/Join を確認しましたが、タスクに依存関係を追加できないようです。
誰でもJava APIを修正するように教えてもらえますか?
Javaでタスク(依存および独立)を並行して実行する方法を見つける必要があります。
java.util.concurrent Future と Fork/Join を確認しましたが、タスクに依存関係を追加できないようです。
誰でもJava APIを修正するように教えてもらえますか?
依存関係のあるタスクの一般的なプログラミング モデルはDataflowです。各タスクが 1 つしか依存関係を持たない簡略化されたモデルは、繰り返しますが、アクター モデルです。Java 用のアクター ライブラリは多数ありますが、データフロー用のライブラリはほとんどありません。参照: which-actor-model-library-framework-for-java、java-pattern-for-nested-callbacks
BlockingQueue を使用します。タスク A の出力をキューに入れると、タスク B はキューで何かが利用可能になるまでブロックします。
ドキュメントには、これを実現するためのコード例が含まれています: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html
タスク B がタスク A の出力に依存している場合、最初にタスク B が本当に別のタスクであるかどうかを疑問視します。次の場合、タスクを分離することは理にかなっています。
それが別のタスクであると仮定すると、タスク A と BBlockingQueue
がタスク B のデータを渡すことができるように、タスク A と B が a を共有できるようにすることができます。
必要なのはCountDownLatchです。
final CountDownLatch gate = new CountDownLatch(2);
// thread a
new Thread() {
public void run() {
// process
gate.countDown();
}
}.start();
// thread c
new Thread() {
public void run() {
// process
gate.countDown();
}
}.start();
new Thread() {
public void run() {
try {
gate.await();
// both thread a and thread c have completed
// process thread b
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
別の方法として、シナリオによっては、 BlockingQueueを使用して Producer-Consumer パターンを実装することもできます。ドキュメントページの例を参照してください。
このライブラリhttps://github.com/familysyan/TaskOrchestrationを使用してください。タスクの依存関係を管理します。