たとえば、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) {
//...
}
}
問題は次のとおりです。get()メソッドから15個すべてのMyResultオブジェクトを取得する代わりに、15個未満のオブジェクトを取得することがあります。時には12、時には10、時にはさらに少なく、時にはすべて15。
メソッドはブロッキング呼び出しであり、15個のスレッドすべてがそれぞれの結果を返すのを待つという印象を受けましたがget()
、そのうちのいくつかを見逃して先に進むようです。私が間違っているのは何ですか?結果を収集していない/結果を正しく待っていませんか?これは、MyProcessorタスクのいずれかからエラーがスローされたときに発生しますか?