运行 方法使用 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);
像 thenRunAsync
和 thenRun
这样的方法有一个 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);
我是 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);
像 thenRunAsync
和 thenRun
这样的方法有一个 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);