Веб-версияОткрыть в Telegram

Пост☕️ Java-совет: не запускайте блокирующий I/O через `CompletableFuture` без собственного пула

6 августа 2026
J
Java Books
☕️ Java-совет: не запускайте блокирующий I/O через `CompletableFuture` без собственного пула Такой код выглядит асинхронным: CompletableFuture<User> future = CompletableFuture.supplyAsync(() -> userClient.loadUser(id)); Но без явного Executor задача обычно попадёт в общий ForkJoinPool.commonPool(). Если loadUser() ждёт HTTP, базу данных или файловую систему, поток блокируется. Несколько медленных вызовов могут занять весь общий пул и затормозить совершенно несвязанные операции приложения. Лучше выделить отдельный пул для блокирующего I/O: private static final ExecutorService IO_POOL = Executors.newFixedThreadPool(32); CompletableFuture<User> future = CompletableFuture.supplyAsync( () -> userClient.loadUser(id), IO_POOL ); И не забыть корректно его закрыть: IO_POOL.shutdown(); Для цепочки тоже важно явно выбирать executor: future.thenApplyAsync( user -> enrichUser(user), IO_POOL ); Почему это полезно: - медленный внешний сервис не блокирует общий пул; - нагрузку можно ограничить размером executor; - проще наблюдать очередь и время выполнения; - разные типы задач не мешают друг другу. CompletableFuture не делает блокирующий код неблокирующим. Он лишь переносит ожидание в другой поток. Асинхронность без контроля executor - это просто блокировка в менее заметном месте.
9 · 2.6K ·

Рядом в ленте

JJava Books💡 Java cj: unmodifiableList() не делает настоящую копию Эти два варианта выглядят похоже, но работают по-разному: List<String> source = new ArrayList<>(); sourcJJava Books💡 Java совет: два пути могут указывать на один и тот же файл Path.equals() сравнивает только представление пути: Path a = Path.of("data.txt"); Path b = Path.of(
это сообщение
JJava Books⚡️ Java-приём: не храни метаданные классов в `static Map<Class<?>, ...>` — используй `ClassValue`. Допустим, библиотека кеширует информацию о каждом классе: priJJava BooksПолезный Java-совет: Не вызывай parallelStream() просто потому, что данных много. Для коротких операций он легко оказывается медленнее обычного stream(), потому

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем