Автоматическое закрытие ExecutorService
Использование try-with-resources для автоматического завершения работы исполнителя.
Сравнение кода
✕ Java 8
ExecutorService exec =
Executors.newCachedThreadPool();
try {
exec.submit(task);
} finally {
exec.shutdown();
exec.awaitTermination(
1, TimeUnit.MINUTES);
}
✓ Java 19+
try (var exec =
Executors.newCachedThreadPool()) {
exec.submit(task);
}
// auto shutdown + await on close
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Автоматическая очистка
Завершение работы происходит автоматически при выходе из блока.
Нет утечек
Исполнитель всегда завершает работу, даже при исключениях.
Знакомый паттерн
Тот же try-with-resources, что и для файлов, соединений и т.д.
Старый подход
Ручное завершение работы
Современный подход
try-with-resources
Начиная с JDK
19
Сложность
Начинающий
Поддержка JDK
Автоматическое закрытие ExecutorService
Доступно
Широко доступно с JDK 19 (сент. 2022)
Как это работает
Начиная с Java 19, ExecutorService реализует AutoCloseable. Метод close() вызывает shutdown() и ожидает завершения задач. Больше не нужны ручные паттерны try/finally для завершения работы.
Связанная документация
Доказательство