2013-09-19 2 views
2

Я создал один вызываемый, который печатает пару строк и спит в течение 2 секунд. Я создал основной метод, который создает 10 экземпляров этого вызываемого и передает метод invokeALL для ExecutorService.почему все Future.get() throwing CancelleationException в invokeAll с таймаутом

service.invokeAll(callableList, 3, SECONDS); 

, когда я повторяю возвращаемый список объектов будущего. Я получаю исключение CancellationException.

Я тестирование, будет ли все future.get() вызова вызывает CancellationException или только те задачи, которые могли бы не могли полным и были отменены.

Я получаю либо все результаты или все CancellationExceptions независимо от установки в invokeALL времени.

Я действительно ожидал, что по крайней мере некоторые задачи будут завершены и вернут мне результаты, когда я позвоню future.get().

ответ

2

Короткий ответ.

Все задачи не выполняются через 3 секунды.

Долгий ответ.

TPE выполнит все задачи и дождитесь их завершения. Он будет выполнять get в каждом будущем с 3 секундами в качестве времени ожидания для метода get. Если все задачи завершаются менее чем за 3 секунды, список фьючерсов не будет изменен.

Если это не завершено в ожидаемое время, то незавершенные фьючерсы будут отменены. Поэтому, если у вас есть 5 заданий, а первые 2 завершены, но в 3 раза, то 3, 4 и 5 отменены.

Это немного указано в документации

Возвращает: список фьючерсов, представляющих задачи, в том же последовательном порядке как произведено итератора для данного списка задач. Если операция не закончилась, каждая задача будет завершена. Если он закончил , некоторые из этих задач не будут выполнены.

и

После возвращения, задачи, которые не завершены отменены.

+0

Но я считаю, что все задачи отменены или завершены. Это все или ничего. – Mayur

+0

Это, вероятно, означает, что первая не завершится через 3 секунды. TPE будет проходить через «отменить» каждое Будущее. Если будущее будет завершено, отмена будет noop. –

+0

И вы уверены, что ** ВСЕ ** задачи отменены? Исключение CancellationException будет выброшено, если только один будет отменен (при условии, что вы выполняете итерацию над каждым и «получите») –