Java

Асинхронные задачи через CompletableFuture

Algonexys · 07.08.2026 · 👁 0

Параллельные вызовы, объединение результатов, таймаут и обработка исключений.

Код

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();
    }
}