gpt4 book ai didi

java - 为什么 CompletableFuture 没有按顺序执行?

转载 作者:行者123 更新时间:2023-12-04 07:16:13 25 4
gpt4 key购买 nike

我的目标是了解 CompletableFuture 是如何工作的。
我的预期结果:如果我这样做 CompletableFuture.runAsync().thenRun().thenRunAsync() .线程将按顺序执行runAsync() -> thenRun() -> thenRunAsync() .
我的实际结果:序列是竞争条件。有时:

  • runAsync -> thenRunAsync+e -> ...
  • runAsync -> thenRun -> ...

  • Reference from SO
    public class RunExample5 {
    public static void main(String[] args) {
    ExecutorService e = Executors.newSingleThreadExecutor(r -> new Thread(r, "sole thread"));
    CompletableFuture<?> f = CompletableFuture.runAsync(() -> {
    System.out.println("runAsync:\t" + Thread.currentThread());
    LockSupport.parkNanos((int) 1e9);
    }, e);
    f.thenRun(() -> System.out.println("thenRun:\t" + Thread.currentThread()));
    f.thenRunAsync(() -> System.out.println("thenRunAsync:\t" + Thread.currentThread()));
    f.thenRunAsync(() -> System.out.println("thenRunAsync+e:\t" + Thread.currentThread()),
    e);
    LockSupport.parkNanos((int) 2e9);
    e.shutdown();
    }
    }

    最佳答案

    你需要

    f.thenRun(() -> System.out.println("thenRun:\t" + Thread.currentThread()))
    .thenRunAsync(() -> System.out.println("thenRunAsync:\t" + Thread.currentThread()))
    .thenRunAsync(() -> System.out.println("thenRunAsync+e:\t" + Thread.currentThread()), e);
    CompletableFuture的接口(interface)不像你想象的那样工作。 f它本身不会记录对 thenRun 的每次调用。或 thenRunAsync并按顺序运行它们;相反,它处理来自 thenRun 的所有内容或 thenRunAsync主要工作完成后即可同时运行。如果要链接更复杂的工作序列,则需要使用 thenRun 的返回值或 thenRunAsync -- 一个 CompletionStage对象 -- 并调用 thenRunAsync在那。

    关于java - 为什么 CompletableFuture 没有按顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68741728/

    25 4 0