java - 可以传递给 ExecutorService 的对象,并且 Runnable 之间具有依赖关系

标签 java multithreading runnable executorservice completable-future

我正在尝试创建一个具有依赖关系的对象。关键是,具有 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?
  }
}

当这些类是一个时,我曾经使用 CompletableFuture:

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

但是现在pool驻留在另一个类中。我更多地查看了 CompletableFuture 类的文档,但我仍然不确定它是否有帮助。

有人了解这方面的知识吗?

最佳答案

对于线性依赖关系,您可以只返回一个新的 Runnable 来逐一执行任务。这样您就可以完全控制执行顺序。 Runnable 列表不能保证顺序 - 您还需要其他类遵守约定。

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

我实际上有一个支持可运行依赖图的想法,但不确定什么时候会有用。有时间后我会尝试编写它。

关于java - 可以传递给 ExecutorService 的对象,并且 Runnable 之间具有依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37159536/

相关文章:

c# - 等待BackgroundWorker RunWorkerCompleted

java - 将空值绑定(bind)到 Play Framework 2 (Java) 中的数字字段

java - 找不到 JDK

python - 绘图时多重处理不起作用

c++ - std::thread::join 是否保证写入可见性

Android - 关于postDelayed和Threads的问题

java - 如何关闭在我的java应用程序中运行的所有线程?

java - 完成 future : several tasks

java - StringBuilder.append 内存不足

java - 无法写入 ID 为 0 的 JSON : Unable to find com. demo.model.Control;