Ответ
Метод 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.