0

依存関係を持つオブジェクトを作成しようとしています。つまり、ExecutorService を持つクラスと、Runnables を生成するクラスは異なります。簡単な抽象化は次のとおりです。

public class Main {
  private ExecutorService pool; // Initialized before executing main
  public static void main(String[] args) {
    List<Batch> batches = // fetching...
    for(Batch batch : batches) {
      Runnable r = batch.getRunnable();
      pool.submit(r);
    }
  }
}

public class Batch {
  public Runnable getRunnable() {
    Runnable r1 = // creating...
    Runnable r2 = // creating...
    // FIXME: demand that r2 run after r1 finishes
    return // something suitable. r1? r2? or new Runnable?
  }
}

これらのクラスが 1 つの場合、以前は CompletableFuture を使用していました。

CompletableFuture.runAsync(r1, pool)
                 .thenRunAsync(r2, pool)
                 .exceptionally(ex -> { // Do something });

しかし、今poolは別のクラスに存在します。CompletableFuture クラスのドキュメントをもっと見ていますが、それが役立つかどうかはまだわかりません。

この辺に詳しい人いませんか?

4

2 に答える 2

1

線形依存関係の場合Runnable、タスクを 1 つずつ実行する new を返すだけです。このようにして、実行順序を完全に制御できます。のリストはRunnable順序を保証しません。コントラクトを尊重するには、他のクラスも必要です。

public Runnable getRunnable() {
    Runnable r1 = ...
    Runnable r2 = ...
    return ()->{
         r1.run();
         r2.run();
    };
}

私は実際に Runnable Depenency Graph をサポートするという考えを持っていましたが、それがいつ役立つかはわかりません。時間ができたらコーディングしてみます。

于 2016-05-12T07:15:41.593 に答える
1

BatchクラスはRunnable、順番に処理する必要があるいくつかを提供することになっていると主張することができます。したがって、いくつかをRunnable別の内部にカプセル化すると、多くRunnableが隠される可能性があります。

しかし、コードを単純化するという要件を理解していますRunnable。単純な解決策は次のとおりです。

public class Batch implements Runnable{
    public List<Runnable> getRunnable() {
    Runnable r1 = // creating...
    Runnable r2 = // creating...
    // FIXME: demand that r2 run after r1 finishes
    return // List of r1, r2, ....
}

@Override
public void run(){
    for (Runnable r:getRunnable()){
        r.run();
    }
}

もちろん、この方法では、バッチはRunnable一連のものとしてではなく、 1 つとして処理されRunnableます。

編集

Batch実装されるRunnableと、クラスMainは次のようになります。

public class Main {
  private ExecutorService pool; // Initialized before executing main
  public static void main(String[] args) {
    List<Batch> batches = // fetching...
    for(Batch batch : batches) {
      pool.submit(batch);
    }
  }
}
于 2016-05-11T10:53:03.007 に答える