Почему моя цепочка CompletableFuture ведет себя по-разному при использовании thenApply() и thenCompose() с асинхронными JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему моя цепочка CompletableFuture ведет себя по-разному при использовании thenApply() и thenCompose() с асинхронными

Сообщение Anonymous »

Почему моя цепочка CompletableFuture ведет себя по-разному при использовании thenApply() и thenCompose() с асинхронными операциями?
  • При использовании thenApply() выходные данные показывают вложенные фьючерсы, и вызов не ждет завершения внутреннего асинхронного вычисления.
  • При использовании thenCompose() результат корректно выравнивается, и окончательный результат get() возвращает ожидаемые данные.
import java.util.concurrent.*;

public class CompletableFutureExample {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newFixedThreadPool(2);

CompletableFuture future = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " - Fetching user");
sleep(1000);
return "User123";
}, executor);

CompletableFuture result1 = future.thenApply(user -> fetchUserDetails(user, executor));
CompletableFuture result2 = future.thenCompose(user -> fetchUserDetailsAsync(user, executor));

System.out.println("Result1: " + result1.get()); // (1)
System.out.println("Result2: " + result2.get()); // (2)

executor.shutdown();
}

static String fetchUserDetails(String user, ExecutorService executor) {
System.out.println(Thread.currentThread().getName() + " - Fetching details for " + user);
sleep(500);
return "Details of " + user;
}

static CompletableFuture fetchUserDetailsAsync(String user, ExecutorService executor) {
return CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " - Fetching async details for " + user);
sleep(500);
return "Async details of " + user;
}, executor);
}

static void sleep(long ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... enapply-vs
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»