Убей будущее полностью через некоторое время - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть future, который выполняет некоторые интенсивные задачи. Я называю это future с таймаутом. Если время истекает, я выдаю исключение обратно клиенту, а также создаю еще один scheduledfuture для отмены первого future через некоторое время. Идея состоит в том, чтобы дать некоторое время после начального таймаута для future, чтобы завершить свою задачу, но если оно не завершится в это время, просто убейте его.

Мой код выглядит как

try {
    return future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException) {
   //create a scheduledfuture here which waits for another 5s
   // and kill the above future is it is still not done
   //the callable of scheduledfuture looks like -
   /*
   if (!future.isDone()) {
       future.cancel(true);
   }
   */
}

Теперь два вопроса здесь -
1. future.cancel(true) просто установит флаг прерывания в true. Это не завершит задачу как есть. Как мне закончить задачу? Есть ли внутри процесс JVM, который проверяет потоки на наличие прерванного флага и завершает их, если имеет значение true?
2. Поскольку теперь установлен флаг прерывания, после завершения задачи существует ли процесс, который сбрасывает флаг? В противном случае поток, управляемый через ExecutorService, потерпит неудачу с InterruptedException, когда попытается принять следующий запрос, содержащий блокирующий вызов.

1 Ответ

0 голосов
/ 01 ноября 2018

Как мне закончить задание?

Запустить задачу - это отдельный процесс и убить процесс, чтобы остановить его. Не существует безопасного способа остановить поток в Java, если только задача не была закодирована для его поддержки.

Поскольку флаг прерывания теперь устанавливается после завершения задачи, существует ли процесс, который сбрасывает флаг?

Да, ExecutorService сбрасывает флаг прерывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...