У меня есть набор Futures
, созданный путем отправки Callable
s на номер Executor
. Псевдокод:Тайм-аут в ожидании завершения партии фьючерсов?
for all tasks
futures.add(executor.submit(new callable(task)))
Теперь я хотел бы получить все фьючерсы, ожидающие не более n секунд, пока все не закончится. Я знаю, что могу позвонить Future#get(timeout)
, но если я назову это последовательно для всех своих фьючерсов в цикле, таймауты начнут складываться. Псевдо код:
for all futures
future.get(timeout)
get
блоки с тайм-аут, пока результат будет готов. Поэтому, если первое завершено непосредственно перед таймаутом, а второе также завершается непосредственно перед таймаутом, и так все время выполнения составляет number of futures * timeout
максимум, а не timeout
.
Следовательно, я ищу метод, который принимает список Future
s и тайм-аут, выполняет все параллельно и затем возвращает коллекцию будущих результатов. Есть идеи?
Это еще не совсем ясно. Что вы хотите выполнить с задачами, которые не были выполнены, когда истекает время ожидания? Вы хотите, чтобы их отменили или разрешили продолжить? –
Их следует отменить. Кроме того, почему-то мне нужно знать, какие из них были выполнены, а какие нет. Думаю, для этого я мог повторить еще раз по фьючерсам и вызывать 'isDone' на всех из них. –