2015-07-23 3 views
4

У меня есть ExecutorService, который используется для вызова коллекции вызываемых объектов и возвращает объекты List of Future, соответствующие элементам Callable в коллекции.Перемещение списка <Future> объект throws IndexOutOfBounds exception

Однако, где-то во время обхода списка, он выдает следующее исключение:

java.util.concurrent.ExecutionException: java.lang.IndexOutOfBoundsException: Index: 7, Size: 1 
at java.util.concurrent.FutureTask.report(Unknown Source) 
at java.util.concurrent.FutureTask.get(Unknown Source) 
at com.soc.transformcsv.ParallelTransformationPool.doExecute(ParallelTransformationPool.java:91) 

код я выполнения является

List<Future<StringBuilder>> futures = executor.invokeAll(builders); 
executor.shutdown(); 
HashMap<String, List<StringBuilder>> allServiceTypeRows = new LinkedHashMap<>(); 

for (Future<StringBuilder> future : futures) { 
    // I have tried putting future.isDone() which always prints true before the exception 
    StringBuilder recordBuilder = future.get(); 
    // do more 
} 

Это дает мне ошибку на future.get() линии.

Пожалуйста, помогите решить блокпост или сообщите мне, что еще я предоставляю.

ответ

4

Результат isDone() может быть правдой , даже если в Callable было исключение. От isDone documentation:

Возвращает true, если эта задача выполнена. Завершение может быть связано с нормальным завершением, исключением или отменой - во всех этих случаях этот метод вернет true.

Итак, будущее, о котором идет речь, сделано, но столкнулось с ошибкой во время вычисления. Под трассировкой стека, которую вы отправили, должен быть еще один, который отображает «Caused by:» - это приведет к сбою root из вашего Callable.

В качестве примера см. Вывод от this ideone link. Это исключение приходит после успешно проверки, что isDone верно:

Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: This is a failure! 
    at java.util.concurrent.FutureTask.report(FutureTask.java:122) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:192) 
    at Ideone.main(Main.java:16) 
Caused by: java.lang.RuntimeException: This is a failure! 
    at Ideone$SampleCallable.call(Main.java:21) 
    at Ideone$SampleCallable.call(Main.java:19) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at Ideone.main(Main.java:14) 
+0

Да, корневой отказ предоставляет мне «OutOfMemoryError», и я понимаю, что это происходит во время выполнения конкретной задачи. Я нахожусь на нем. –

2

Исключение не происходит при обходе List<Future>. Фактически IndexOutOfBoundsException произошло, пока ExecutorService был исполнен call() способ вашего Callable (один из builders).

Но это исключение выбрасывается (обернуто внутри ExecutionException) только при попытке получить результат Future с использованием future.get().