Я использую ExecutorService в Java и заметил поведение, которое я не понимаю.
Я использую Callable, и когда я вызываю свои потоки (классы, которые реализуют Callable), я устанавливаю таймаут. Затем я жду результата с помощью future.get()
и после того, как хочу проверить с помощью future.isDone()
, произошел ли тайм-аут во время выполнения задач.
Как я читал в документации по invokeAll с таймаутом: returns a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list. If the operation did not time out, each task will have completed. If it did time out, some of these tasks will not have completed.
Поэтому я подумал, что получу список результатов в будущем в обоих случаях, если истечет время ожидания, а если нет.
Теперь происходит следующее: когда происходит тайм-аут, код не запускается после future.get()
, и я даже не дохожу до того, что могу проверить, не произошел ли тайм-аут с future.isDone()
. Я не уловил никаких исключений, я непосредственно привел к блоку finally в моем коде, который я действительно не понимаю.
вот фрагмент моего кода:
try {
// start all Threads
results = pool.invokeAll(threads, 3, TimeUnit.SECONDS);
for (Future<String> future : results)
{
try
{
// this method blocks until it receives the result, unless there is a
// timeout set.
final String rs = future.get();
if (future.isDone())
{
// if future.isDone() = true, a timeout did not occur.
// do something
}
else
{
// timeout
// log it and do something
break;
}
}
catch (ExecutionException e)
{
// log messages and break, this is a snippet!
}
catch (InterruptedException ex)
{
// log message and break, this is a snippet!
}
}
}
catch (InterruptedException ex)
{
// log message, this is a snippet!
}
finally
{
// when a timeout occurs, the code jumps from future.get() directly to this point!
}
Может кто-нибудь объяснить мне, почему я не могу дозвониться до future.isDone()
и что я должен изменить, чтобы иметь возможность распознавать тайм-ауты?
Спасибо!