运行 方法使用 completablefuture 异步

Run methods in asynchronously by using completablefuture

我是 java 8 Completablefuture 的新手,我正在尝试按顺序调用异步方法

我的代码:

public class Main {

public static void main(String[] args) {
    System.out.println("CompletableFuture");
    ExecutorService e = Executors.newSingleThreadExecutor(r -> new Thread(r, "single Thread"));
    CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(()-> print("thread 1"),e);
    runT(voidCompletableFuture);
    voidCompletableFuture.thenRunAsync(()->print("Thread 3"));
    voidCompletableFuture.thenRun(e::shutdown);
}
public static void print(String threadName){
    for(int i=1;i<=10;i++) {
        System.out.println(threadName + ":" + i);
    }
}

public static void runT(@NotNull CompletableFuture<Void> ayns){
    ayns.thenRunAsync(()->print("Thread 2"));
}

}

但代码的工作方式不同,并以非序列顺序调用异步方法。

输出:

CompletableFuture
thread 1:1
thread 1:2
thread 1:3
thread 1:4
thread 1:5
thread 1:6
thread 1:7
thread 1:8
thread 1:9
thread 1:10
Thread 2:1
Thread 3:1
Thread 3:2
Thread 3:3
Thread 3:4
Thread 3:5
Thread 3:6
Thread 3:7
Thread 3:8
Thread 3:9
Thread 3:10
Thread 2:2
Thread 2:3
Thread 2:4
Thread 2:5
Thread 2:6
Thread 2:7
Thread 2:8
Thread 2:9
Thread 2:10

根据代码逻辑,“线程 1”、“线程 2”、“线程 3”需要执行,但在输出中调用了“线程 1”,然后调用了“线程 2”,但“线程 2”未完成,但“ Thread 3”开始执行,只有“Thread 3”完全执行,然后“Thread 2”再次启动。

我的问题是为什么会这样?如果我的实现不正确,请建议我在 java 8.

中实现此功能的任何方法

您将 3 个不同的阶段链接到一个阶段 voidCompletableFuture:

  • 两个thenRunAsync
  • 一个thenRun

当然,它们 运行 的顺序未定义。如果您确实需要顺序,请不要忽略这些方法的结果并将一些依赖操作链接到它们。例如:

voidCompletableFuture
    .thenRunAsync(()->print("Thread 3"))
    .thenRun(e::shutdown);

thenRunAsyncthenRun 这样的方法有一个 return 类型——不要忽略它(就像你一样)。


你的情况:

public static CompletableFuture<Void> runT(@NotNull CompletableFuture<Void> ayns){
   CompletableFuture<Void> result = ayns.thenRunAsync(()->print("Thread 2"));
   return result;
}

现在正确链接它:

CompletableFuture<Void> voidCompletableFuture = CompletableFuture.runAsync(()-> print("thread 1"),e);
CompletableFuture<Void> newF = runT(voidCompletableFuture);
newF.thenRunAsync(()->print("Thread 3"));
    .thenRun(e::shutdown);