【发布时间】:2021-06-13 17:39:14
【问题描述】:
我是 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”没有完成但“线程3” " 开始执行,只有 "Thread 3" 完全执行,然后 "Thread 2" 重新开始。
我的问题是为什么会这样?如果我的实现不正确,请建议我在 java 8 中实现此功能的任何方法。
【问题讨论】:
-
您已将 3 个不同的阶段链接到您的
voidCompletableFuture。当然,它们以任何顺序运行,您期望什么?
标签: java multithreading java-8 completable-future