Почему моя цепочка 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

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