При использовании объектов ExecutorService
и Future
(при отправке задач Runnable
), если я укажу значение тайм-аута для будущей функции get, будет ли основной поток быть убит при вызове TimeoutException
?
Выполняет ли таймаут в будущем выполнение Thread
Ответ 1
Это не так. Почему? Если вы не сообщите об этом.
Здесь существует очень важная проблема в случае, например, для Callable. Если вы ожидали результата за 20 секунд, и вы его не получили, то вас больше не интересует результат. В то время вы должны вообще отменить задачу.
Что-то вроде этого:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
Ответ 2
Нет, это не так. Моровер даже не пытался прервать задачу. В первую очередь Future.get с таймаутом не говорит об этом. Во-вторых, попробуйте мой тест, чтобы увидеть, как он себя ведет.
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
через 1 секунду он печатает
Exception in thread "main" java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
at java.util.concurrent.FutureTask.get(FutureTask.java:91)
at Test1.main(Test1.java:23)
через 1 секунду задача успешно завершается
finished
Ответ 3
Кажется, что вам нужно убить, отменить или закрыть задачу явно