Java
Асинхронные задачи через CompletableFuture
Параллельные вызовы, объединение результатов, таймаут и обработка исключений.
Код
import java.time.Duration;
import java.util.List;
import java.util.concurrent.*;
import java.util.stream.Collectors;
public class AsyncExamples {
static final ExecutorService POOL = Executors.newVirtualThreadPerTaskExecutor();
static CompletableFuture<String> fetch(String url) {
return CompletableFuture.supplyAsync(() -> {
// сетевой вызов
return "ответ от " + url;
}, POOL);
}
public static void main(String[] args) throws Exception {
// Последовательная цепочка преобразований
CompletableFuture<Integer> chain = fetch("https://api.example.com/users")
.thenApply(String::trim)
.thenApply(String::length)
.exceptionally(ex -> {
System.err.println("Ошибка: " + ex.getMessage());
return 0;
});
// Параллельные запросы и ожидание всех
List<CompletableFuture<String>> futures = List.of("a", "b", "c").stream()
.map(AsyncExamples::fetch)
.toList();
CompletableFuture<List<String>> all = CompletableFuture
.allOf(futures.toArray(CompletableFuture[]::new))
.thenApply(v -> futures.stream().map(CompletableFuture::join)
.collect(Collectors.toList()));
System.out.println(all.orTimeout(10, TimeUnit.SECONDS).get());
// Объединение двух независимых результатов
fetch("/profile").thenCombine(fetch("/settings"),
(profile, settings) -> profile + " + " + settings)
.thenAccept(System.out::println)
.join();
POOL.shutdown();
}
}