16

Javaでタスク(依存および独立)を並行して実行する方法を見つける必要があります。

  1. タスク A とタスク C は独立して実行できます。
  2. タスク B は、タスク A の出力に依存しています。

java.util.concurrent Future と Fork/Join を確認しましたが、タスクに依存関係を追加できないようです。

誰でもJava APIを修正するように教えてもらえますか?

4

8 に答える 8

4

依存関係のあるタスクの一般的なプログラミング モデルはDataflowです。各タスクが 1 つしか依存関係を持たない簡略化されたモデルは、繰り返しますが、アクター モデルです。Java 用のアクター ライブラリは多数ありますが、データフロー用のライブラリはほとんどありません。参照: which-actor-model-library-framework-for-javajava-pattern-for-nested-callbacks

于 2012-06-01T18:30:45.590 に答える
1

BlockingQueue を使用します。タスク A の出力をキューに入れると、タスク B はキューで何かが利用可能になるまでブロックします。

ドキュメントには、これを実現するためのコード例が含まれています: http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html

于 2012-06-01T18:38:55.413 に答える
0

タスク B がタスク A の出力に依存している場合、最初にタスク B が本当に別のタスクであるかどうかを疑問視します。次の場合、タスクを分離することは理にかなっています。

  • タスク A の結果が必要になる前にタスク B が実行できる重要な量の作業
  • タスク B は、タスク A のさまざまなインスタンスからの出力を処理する、長期にわたって進行中のプロセスです。
  • タスク A の結果も使用する他のタスク (D など) がいくつかあります。

それが別のタスクであると仮定すると、タスク A と BBlockingQueueがタスク B のデータを渡すことができるように、タスク A と B が a を共有できるようにすることができます。

于 2012-06-01T18:24:37.393 に答える
0

必要なのは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 パターンを実装することもできます。ドキュメントページの例を参照してください。

于 2012-06-01T18:01:23.663 に答える
0

このライブラリhttps://github.com/familysyan/TaskOrchestrationを使用してください。タスクの依存関係を管理します。

于 2016-06-24T18:44:21.483 に答える