Что возвращает метод submit() у ThreadPoolExecutor в Java?

«Что возвращает метод submit() у ThreadPoolExecutor в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод submit() интерфейса ExecutorService (реализуемого ThreadPoolExecutor) возвращает объект Future<T>, который представляет собой отложенный результат асинхронного вычисления.

Перегрузки метода submit():

Future<?> submit(Runnable task);           // Для задач без результата
<T> Future<T> submit(Runnable task, T result); // Для задач с заранее заданным результатом
<T> Future<T> submit(Callable<T> task);    // Для задач, возвращающих результат

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

import java.util.concurrent.*;

public class SubmitExample {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newFixedThreadPool(2);

        // 1. Submit с Runnable (возвращает Future<?>)
        Future<?> future1 = executor.submit(() -> {
            System.out.println("Выполняется Runnable");
        });
        future1.get(); // get() возвращает null после завершения Runnable

        // 2. Submit с Callable (возвращает Future<Integer>)
        Future<Integer> future2 = executor.submit(() -> {
            Thread.sleep(1000);
            return 42;
        });

        // Методы Future:
        System.out.println("Задача завершена? " + future2.isDone()); // false
        Integer result = future2.get(); // Блокируется, пока задача не завершится
        System.out.println("Результат: " + result); // 42
        System.out.println("Задача завершена? " + future2.isDone()); // true

        // 3. Отмена задачи
        Future<String> future3 = executor.submit(() -> {
            Thread.sleep(5000);
            return "Медленный результат";
        });
        future3.cancel(true); // Попытка прервать задачу

        executor.shutdown();
    }
}

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

  • get() — блокирует поток до получения результата (или таймаута).
  • isDone() — проверяет, завершена ли задача.
  • cancel(boolean mayInterruptIfRunning) — пытается отменить выполнение.
  • isCancelled() — проверяет, была ли задача отменена.

submit() — это предпочтительный метод для отправки задач, так как он предоставляет контроль над их выполнением через Future.