Метод supplyAsync
Метод supplyAsync класса CompletableFuture запускает
асинхронную задачу, которая возвращает некоторый результат.
В отличие от метода runAsync, который ничего не возвращает,
метод supplyAsync принимает на вход функциональный интерфейс
Supplier и возвращает CompletableFuture с результатом
вычисления. Задача выполняется в отдельном потоке из пула
ForkJoinPool.commonPool. Первым параметром метод принимает
поставщика результата, вторым (необязательным) - исполнителя
Executor, в пуле которого будет выполнена задача.
Синтаксис
CompletableFuture.supplyAsync(Supplier<U> supplier)
CompletableFuture.supplyAsync(Supplier<U> supplier, Executor executor)
Пример
Давайте запустим асинхронную задачу, которая возвращает строку:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "abcde";
});
System.out.println(future.join());
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте запустим асинхронную задачу, которая возвращает число,
и преобразуем результат с помощью метода thenApply:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
return 5;
});
CompletableFuture<Integer> res = future.thenApply(n -> n * 2);
System.out.println(res.join());
}
}
Результат выполнения кода:
10
Пример
Давайте передадим во второй параметр собственный исполнитель
Executor, в пуле которого будет выполнена задача:
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
public static void main(String[] args)
{
ExecutorService executor = Executors.newFixedThreadPool(2);
CompletableFuture<List<Integer>> future = CompletableFuture.supplyAsync(() -> {
return List.of(1, 2, 3, 4, 5);
}, executor);
System.out.println(future.join());
executor.shutdown();
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Смотрите также
-
класс
CompletableFuture,
который представляет асинхронное вычисление -
метод
runAsync,
который запускает асинхронную задачу без результата -
метод
thenApply,
который преобразует результат вычисления -
метод
join,
который ожидает завершения и возвращает результат