Java CompletableFuture.supplyAsync(): руководство по асинхронному выполнению задач

Понимание CompletableFuture.supplyAsync()

В Java класс CompletableFuture предоставляет мощный способ написания асинхронного неблокирующего кода. Одним из методов, предоставляемых CompletableFuture, является supplyAsync(), который позволяет выполнить задачу асинхронно и получить CompletableFuture, который в конечном итоге будет содержать результат задачи. В этой статье мы рассмотрим метод supplyAsync()и обсудим его использование на примерах кода.

Введение в CompletableFuture.supplyAsync()

Метод supplyAsync()— это фабричный метод, который принимает в качестве параметра функциональный интерфейс Supplier. Интерфейс Supplierпредставляет поставщика результатов и имеет единственный метод get(), который возвращает результат. Метод supplyAsync()асинхронно выполняет задачу, указанную интерфейсом Supplier, и возвращает CompletableFuture, который в конечном итоге будет содержать результат.

Синтаксис:

CompletableFuture<T> supplyAsync(Supplier<T> supplier)

Где:

  • T— тип результата.
  • supplier — функция поставщика, предоставляющая результат.

Примеры кода

Давайте рассмотрим пару примеров кода, чтобы понять, как можно использовать supplyAsync():

Пример 1. Базовое использование

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            return "Hello, CompletableFuture!";
        });
        future.thenAccept(result -> System.out.println(result));
        // Output: Hello, CompletableFuture!
    }
}

В этом примере мы создаем CompletableFuture, используя supplyAsync(). Функция поставщика — это лямбда-выражение, которое засыпает на 1 секунду, а затем возвращает строку «Hello, CompletableFuture!». Затем мы присоединяем обратный вызов, используя thenAccept(), чтобы распечатать результат, когда он станет доступен.

Пример 2: объединение CompletableFutures

import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
    public static void main(String[] args) {
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello,");
        CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "CompletableFuture!");
        CompletableFuture<String> combinedFuture = future1
                .thenCombine(future2, (result1, result2) -> result1 + " " + result2);
        combinedFuture.thenAccept(System.out::println);
        // Output: Hello, CompletableFuture!
    }
}

В этом примере мы создаем два отдельных экземпляра CompletableFuture, которые предоставляют строки «Hello» и «CompletableFuture!» соответственно. Затем мы используем метод thenCombine(), чтобы объединить результаты обоих фьючерсов путем их объединения. Наконец, мы присоединяем обратный вызов для печати объединенного результата.

В этой статье блога мы рассмотрели метод CompletableFuture.supplyAsync()в Java. Мы узнали о его синтаксисе, использовании и увидели примеры кода, демонстрирующие его функциональность. Используя supplyAsync(), вы можете писать эффективный и масштабируемый асинхронный код на Java.