Я создаю, скажем, 15 вызываемых задач и отправляю их:
List<Future<MyResult>> futures = new ArrayList<Future<MyResult>>();
List<MyResult> myResults = new ArrayList<MyResult>();
for(int i = 1; i <= 15; i++){
Callable<MyResult> task = new MyProcessor(//parameters);
Future<MyResult> future = executorService.submit(task);
futures.add(future);//used to iterate over to call get() to collect results in next for loop
}
Затем я собираю 15 объектов MyResult :
for(Future<MyResult> future : futures){
try {
MyResult myResult = future.get();
processorResults.add(myResult);
} catch (InterruptedException e) {
//...
} catch (ExecutionException e) {
//...
}
}
. Проблема :Вместо того, чтобы вернуть ВСЕ 15 объектов MyResult из метода get (), я иногда возвращаю менее 15 объектов. Иногда 12, иногда 10, иногда даже меньше, а иногда и все 15.
У меня сложилось впечатление, что метод get()
является блокирующим вызовом и будет ждать, пока ВСЕ 15 потоков вернутся с соответствующими результатами, но похоже, что я пропускаю некоторые из них и продвигаюсь вперед. Что я делаю неправильно? Я неправильно собираю результаты/жду результатов? Происходит ли это, когда ERROR возникает из любой задачи MyProcessor?