Что такое ExecutorService в Java и для чего он используется?

«Что такое ExecutorService в Java и для чего он используется?» — вопрос из категории Java Core, который задают на 25% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ExecutorService — это высокоуровневый интерфейс Java Concurrency API для управления пулом потоков (thread pool). Он абстрагирует ручное создание и управление потоками, предоставляя механизм для асинхронного выполнения задач.

Ключевые возможности:

  • Управление пулом: Создание пулов с фиксированным, кэшируемым или одиночным потоком.
  • Отправка задач: Прием задач Runnable и Callable для выполнения.
  • Контроль выполнения: Возврат объекта Future для отслеживания статуса и получения результата.
  • Жизненный цикл: Методы для graceful (shutdown()) и принудительной (shutdownNow()) остановки пула.

Пример использования:

// 1. Создание пула из 4 потоков
ExecutorService executor = Executors.newFixedThreadPool(4);

// 2. Отправка задачи на выполнение
Future<Integer> future = executor.submit(() -> {
    // Длительная операция
    Thread.sleep(1000);
    return 42;
});

// 3. Получение результата (блокирующий вызов)
Integer result = future.get();
System.out.println("Result: " + result);

// 4. Завершение работы пула
executor.shutdown();

Почему это важно: ExecutorService повышает производительность приложения за счет повторного использования потоков, предотвращает истощение ресурсов и упрощает написание конкурентного кода. Используется повсеместно — от обработки HTTP-запросов в серверах до параллельной обработки данных.