gpt4 book ai didi

java - 为什么 CompletableFuture 的 thenAccept() 没有在主线程上运行

转载 作者:搜寻专家 更新时间:2023-11-01 03:34:07 24 4
gpt4 key购买 nike

我在 CompletableFuture 的 supplyAsync() 中处理长时间运行的操作,并将结果放入 thenAccept()。有时 thenAccept() 在主线程上执行,但有时它在工作线程上运行。但我只想在主线程上运行 thenAccept() 操作。这是示例代码。

private void test() {

ExecutorService executorService = Executors.newSingleThreadExecutor();

CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
System.out.println("supplyAsync | I am running on : " + Thread.currentThread().getName());
return "Hello world";
}, executorService);

CompletableFuture<Void> cf3 = cf1.thenAccept(s -> {
System.out.print("thenAccept | I am running on : " + Thread.currentThread().getName());
System.out.println(" | answer : " + s);
});

cf3.thenRun(() -> {
System.out.println("thenRun | I am running on : " + Thread.currentThread().getName());
System.out.println();
});

}

public static void main(String[] args) {

App app = new App();
for(int i = 0; i < 3; i++){
app.test();
}
}

结果是:

supplyAsync | I am running on : pool-1-thread-1
thenAccept | I am running on : main | answer : Hello world
thenRun | I am running on : main

supplyAsync | I am running on : pool-2-thread-1
thenAccept | I am running on : main | answer : Hello world
thenRun | I am running on : main

supplyAsync | I am running on : pool-3-thread-1
thenAccept | I am running on : pool-3-thread-1 | answer : Hello world
thenRun | I am running on : pool-3-thread-1

我该如何解决这个问题?

最佳答案

查看 CompletableFuture 的 JavaDoc .有趣的部分是关于 CompletionStage 政策的部分。

您会发现使用非异步 方法会导致一种非此即彼的情况。如果您随后查看实现,您将最终进入 Java 运行时的非公共(public)部分。有一些 UNSAFE 处理意味着可能会发生某种竞争条件。

我建议使用 thenAcceptAsync()thenRunAsync() 变体并将您的 executorService 变量传递给这两个调用。

关于java - 为什么 CompletableFuture 的 thenAccept() 没有在主线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36981432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com