複数のスレッドからアクセスされるクラスがあり、各スレッドはこのクラスの 1 つのメソッドを要求します。各メソッドは、順番に Callable の数を実行します。このクラスは、ExecutorService の threadPool を使用して、invokeAll((Collection>) executableTasks) メソッドを通じてこれらの Callable を実行します。セットアップは次のようになります。
public MyClass {
private final ExecutorService threadPool = Runtime.getRuntime().availableProcessors();
public void method1() {
List<SomeObject> results = new ArrayList<>();
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ... results.add(someObject);} );
threadPool.invokeAll(tasks);
}
public void method2() {
List<SomeObject> results = new ArrayList<>();
List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
tasks.add(new Callable<Void>(){ ... results.add(someObject);} );
threadPool.invokeAll(tasks);
}
}
これがクラス内のタスクを同時に実行するのか、それともinvokeAll()が1つのメソッド内のタスクが完了するまで実行をブロックするのか混乱しています(クラスレベルではなくメソッド内で同時に実行されることを意味します)? または、対応するタスクの結果を見つけるために CompletionService を使用する必要がありますか?