gpt4 book ai didi

multithreading - CompletableFuture、supplyAsync() 和 thenApply()

转载 作者:行者123 更新时间:2023-12-03 01:44:12 27 4
gpt4 key购买 nike

需要确认一些事情。代码如下:

CompletableFuture
.supplyAsync(() -> {return doSomethingAndReturnA();})
.thenApply(a -> convertToB(a));

将与:

相同
CompletableFuture
.supplyAsync(() -> {
A a = doSomethingAndReturnA();
convertToB(a);
});

对吗?

此外,另外两个问题是“我们有什么理由使用thenApply?”

1) 有大的转换代码吗?

2)需要在其他地方重用lambda block ?

最佳答案

不是同一件事。在没有使用 thenApply 的第二个示例中,可以肯定对 convertToB 的调用与方法 doSomethingAndReturnA 在同一线程中执行。

但是,在第一个示例中,当使用 thenApply 方法时,可能会发生其他情况。

首先,如果执行 doSomethingAndReturnACompletableFuture 已完成,则 thenApply 的调用将在调用者线程中发生。如果 CompletableFutures 尚未完成,则传递给 thenApplyFunction 将在与 doSomethingAndReturnA 相同的线程中调用.

令人困惑?嗯this article might be helpful (感谢@SotiriosDelimanolis 提供的链接)。

我提供了一个简短的示例来说明 thenApply 的工作原理。

public class CompletableTest {
public static void main(String... args) throws ExecutionException, InterruptedException {
final CompletableFuture<Integer> future = CompletableFuture
.supplyAsync(() -> doSomethingAndReturnA())
.thenApply(a -> convertToB(a));

future.get();
}

private static int convertToB(final String a) {
System.out.println("convertToB: " + Thread.currentThread().getName());
return Integer.parseInt(a);
}

private static String doSomethingAndReturnA() {
System.out.println("doSomethingAndReturnA: " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

return "1";
}
}

输出是:

doSomethingAndReturnA: ForkJoinPool.commonPool-worker-1
convertToB: ForkJoinPool.commonPool-worker-1

因此,当第一个操作很慢时(即 CompletableFuture 尚未完成),两个调用都发生在同一个线程中。但是,如果我们要从 doSomethingAndReturnA 中删除 Thread.sleep 调用,则输出(可能)如下所示:

doSomethingAndReturnA: ForkJoinPool.commonPool-worker-1
convertToB: main

请注意,convertToB 调用位于main 线程中。

关于multithreading - CompletableFuture、supplyAsync() 和 thenApply(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723546/

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