Постановка задачи в пул в Java
Фоновая отправка письма не требует ждать доставку в том же методе, но иногда нужно знать, принята ли задача и когда можно запросить результат. Для этого у пула есть постановка с возвратом ссылки на будущий итог.
execute(Runnable) только ставит работу в очередь.
submit делает то же для Runnable, но
возвращает Future<?>, по которой видно состояние
и можно дождаться конца. Для задачи с возвращаемым
значением передают Callable:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(1);
Future<?> fireAndForget = pool.submit(
() -> System.out.println("sent")
);
Callable<Integer> counter = () -> 7 + 5;
Future<Integer> withValue = pool.submit(counter);
fireAndForget.get();
System.out.println(withValue.get());
pool.shutdown();
}
}
Обе постановки дают объект типа Future, но для
Callable параметр типа совпадает с типом
результата. После get() для счётчика на экране
12, для Runnable метод вернёт
null, зато поток дождётся конца печати.
Повторная постановка той же логики через лямбду
Callable удобна, когда вычисление длинное, а
вызывающий код хочет продолжить подготовку данных,
не блокируя поток на время работы пула.
В пул из одного потока поставьте задачу, которая
печатает "go". Выведите признак завершения
сразу после постановки и после ожидания результата.
Затем закройте пул.