Я искал в Интернете уже неделю, но ни один из сообщений, таких как Как мне заставить FutureTask возвращаться после TimeoutException?, кажется, отвечает на мой вопрос. Я извлек образец кода из своего кода:
Future<Object> result = executorService.submit(new Callable<Object>() {
@Override public Object call() throws Exception {
...........
}
});
try {
return result.get(timeout.getValue(), timeout.getUnit().getTimeUnit());
} catch (TimeoutException e) {
result.cancel(true);
throw new TTimeoutException(e);
}
Если я запускаю это, иногда (1 из 1000) я получаю
java.lang.InterruptedException
at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
at java.util.concurrent.FutureTask.get(FutureTask.java:199)
at com.abc.callers.A.call(A.java:83)
а строка №:83 — это результат.get() будущей задачи, показанной в приведенном выше примере кода.
Теперь мой вопрос: может ли вызов result.cancel(true) в будущем вызвать InterruptedException в result.get? Если нет, то кто может изменить статус прерывания моего текущего потока? AFAIK result.get() - это не тот же поток, что и тот, который выполняет мою отправленную задачу, которую я отменяю.