Асинхронный запуск задачи в Java
Два входа в асинхронный мир: вернуть значение или
только выполнить действие. Первое покрывает
supplyAsync с Supplier, второе
runAsync с Runnable. Оба возвращают
CompletableFuture, по которому можно
продолжить цепочку.
Без второго аргумента задача уходит в
ForkJoinPool.commonPool(). Для сетевых
вызовов или блокирующего ввода-вывода лучше передать
свой Executor, чтобы не забить общий пул:
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
CompletableFuture<Integer> sum =
CompletableFuture.supplyAsync(() -> 10 + 32);
System.out.println(sum.join());
ExecutorService pool = Executors.newFixedThreadPool(2);
CompletableFuture<Void> log =
CompletableFuture.runAsync(
() -> System.out.println("logged"),
pool
);
log.join();
pool.shutdown();
}
}
supplyAsync подходит, когда нужен результат
типа T. runAsync завершается
null внутри Void; его берут для
записи в журнал, отправки метрики, очистки ресурса.
Задачу можно описать и вручную через пустой
CompletableFuture и методы complete
или completeExceptionally, когда результат
приходит из колбэка библиотеки. Для обычного кода
на Java 27 чаще хватает supplyAsync и
runAsync.
Запустите supplyAsync, который возвращает
длину строки "catalog", и выведите
join(). Затем runAsync с
печатью "done" и дождитесь.