У меня есть 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
, когда попытается принять следующий запрос, содержащий блокирующий вызов.