Создание и завершение CompletableFutures
Используйте supplyAsync, runAsync и completedFuture, а также вручную завершайте будущие объекты с помощью complete и completeExceptionally.
«Создание и завершение CompletableFutures» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Что такое CompletableFuture
CompletableFuture<T> (Java 8+) представляет асинхронное вычисление, которое можно явно завершить, объединить в цепочку и скомбинировать с другими вычислениями. Он реализует и Future, и CompletionStage.
supplyAsync: запуск асинхронного вычисления
CompletableFuture.supplyAsync() асинхронно выполняет Supplier в общем ForkJoinPool и возвращает future с результатом.
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
// runs on ForkJoinPool.commonPool()
return fetchDataFromNetwork();
});
System.out.println("Non-blocking — this runs immediately");runAsync: запустили и забыли
runAsync() асинхронно выполняет Runnable и возвращает CompletableFuture<Void>. Используйте его, когда результат вам не нужен.
CompletableFuture<Void> task = CompletableFuture.runAsync(() ->
sendEmail("user@example.com", "Welcome!"));
task.thenRun(() -> System.out.println("Email sent"));Пользовательский исполнитель
Передайте пользовательский Executor, чтобы управлять пулом потоков, используемым для вычисления. Это особенно важно в веб-приложениях, где необходимо избежать блокировки общего пула.
ExecutorService pool = Executors.newFixedThreadPool(10);
CompletableFuture<User> future = CompletableFuture.supplyAsync(
() -> userService.findById(42L), pool
);completedFuture: уже готовое значение
CompletableFuture.completedFuture(value) возвращает уже завершённый future. Это удобно для тестирования или когда у вас есть непосредственное значение, которое нужно вернуть в асинхронном конвейере.
CompletableFuture<String> cached = CompletableFuture.completedFuture("cached-value");
cached.thenAccept(System.out::println); // runs immediatelyРучное завершение future
Используйте complete(), чтобы передать результат извне вычисления. Используйте completeExceptionally(), чтобы сообщить о сбое.
CompletableFuture<String> promise = new CompletableFuture<>();
// In another thread or callback:
promise.complete("done!"); // signals success
// promise.completeExceptionally(new RuntimeException("fail")); // signals failure
String result = promise.get(); // blocks until completedget() и join()
И get(), и join() блокируют выполнение до завершения future. get() выбрасывает проверяемые исключения, а join() оборачивает их в непроверяемое исключение CompletionException.
try {
String r = future.get(5, TimeUnit.SECONDS); // checked exceptions
} catch (TimeoutException | InterruptedException | ExecutionException e) { ... }
// Or:
String r = future.join(); // throws CompletionException (unchecked)getNow() для неп_blockирующей проверки
getNow(defaultValue) возвращает результат, если вычисление уже завершено, или переданное значение по умолчанию, если нет. Метод не блокирует выполнение и не ожидает результата.
String result = future.getNow("loading...");
System.out.println(result); // "loading..." if not yet doneisDone, isCancelled, isCompletedExceptionally
Проверяйте состояние future без блокировки. Объединяйте эти проверки в циклах опроса или коде мониторинга.
if (future.isDone()) System.out.println("Completed");
if (future.isCancelled()) System.out.println("Cancelled");
if (future.isCompletedExceptionally()) System.out.println("Failed");cancel() для обработки тайм-аутов
Вызовите cancel(true), чтобы отменить выполняющееся вычисление. Future переходит в состояние отмены, а любой блокирующий вызов get() выбрасывает CancellationException.
CompletableFuture<String> future = fetchAsync();
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.schedule(() -> future.cancel(true), 3, TimeUnit.SECONDS);completeOnTimeout (Java 9+)
completeOnTimeout(value, timeout, unit) автоматически завершает future со значением по умолчанию, если тот не завершился за указанный тайм-аут. Это удобнее, чем отменять вычисление вручную.
CompletableFuture<String> result = fetchAsync()
.completeOnTimeout("default", 3, TimeUnit.SECONDS);
System.out.println(result.join()); // "default" if fetch took > 3sБыстрая проверка
Какой метод запускает асинхронное вычисление в общем ForkJoinPool и возвращает значение?
Итоги
supplyAsync и runAsync запускают асинхронную работу. complete и completeExceptionally завершают вычисление вручную. Используйте join() для блокирующего вызова без проверяемых исключений. completeOnTimeout корректно обрабатывает тайм-ауты.
Часто задаваемые вопросы
Урок «Создание и завершение CompletableFutures» бесплатный?
Да — полный текст урока «Создание и завершение CompletableFutures» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Создание и завершение CompletableFutures»?
Используйте supplyAsync, runAsync и completedFuture, а также вручную завершайте будущие объекты с помощью complete и completeExceptionally. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Создание и завершение CompletableFutures»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Создание и завершение CompletableFutures
- Объединение thenApply и thenCompose в цепочки
- Объединение будущих объектов: allOf и anyOf
- Обработка ошибок и асинхронный конвейер HTTP