Это не то же самое. Во втором примере, где thenApply
не используется, уверен, что вызов convertToB
выполняется в том же потоке, что и метод doSomethingAndReturnA
.
Но, в первом примере, когда используется метод thenApply
, могут случиться другие вещи.
Прежде всего, если CompletableFuture
, выполняющий команду doSomethingAndReturnA
, завершен, вызов thenApply
произойдет в потоке вызывающего абонента. Если CompletableFutures
не был завершен, то Function
, переданный в thenApply
, будет вызываться в той же теме, что и doSomethingAndReturnA
.
Confusing? Ну 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
еще не завершен) оба вызова происходят в том же потоке. Но если мы должны были удалить Thread.sleep
-Call из doSomethingAndReturnA
выхода (может) быть такой:
doSomethingAndReturnA: ForkJoinPool.commonPool-worker-1
convertToB: main
Обратите внимание, что convertToB
вызова в main
потоке.
Этот ответ и этот пост (http://www.deadcoderising.com/java8-writing-asynchronous-code-with -completablefuture /) помогите мне понять CompletableFuture – Jesus
Это все еще не объясняет, почему нужно использовать 'thenApply'? – Yamcha
В первом случае '' '' ForkJoinPool.commonPool-worker-1''' просто зависает там и ждет, пока '' 'doSomethingAndReturnA''' не вернется? – Siddhartha