Контроль выполнения задачи в Java
Пока отчёт считается в фоне, интерфейс может показывать индикатор. Программе нужен объект, который отвечает на вопрос «уже готово?» и при необходимости терпеливо ждёт окончания без опроса потока в цикле.
Future из java.util.concurrent
появляется после submit. Метод isDone()
возвращает true, когда задача завершилась штатно
или с ошибкой. Метод get() блокирует текущий
поток, пока результат не станет доступен:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(1);
Future<String> job = pool.submit(() -> {
Thread.sleep(200);
return "ready";
});
System.out.println(job.isDone());
String text = job.get(3, TimeUnit.SECONDS);
System.out.println(text);
System.out.println(job.isDone());
pool.shutdown();
}
}
Первая печать false, затем строка ready
и снова true. Перегрузка get(timeout, unit)
не ждёт бесконечно: при превышении времени бросается
TimeoutException.
cancel(mayInterrupt) просит остановить задачу,
если она ещё не завершилась. Отмена не гарантирует
мгновенный эффект для тяжёлой работы, но даёт способ
отказаться от ненужного результата при уходе пользователя
со страницы.