私は ExecutorService を初めて使用しますが、これに対する私のアプローチについて確信が持てません。既知のタスクで最大 100 のスレッドを処理できます。以下の一般的な形式を使用しています。ここでは、FutureTasks のリストを作成し、これらを ExecutorService に送信します。ExecutorService はこれらの保留中の結果を返し、別のリストに追加します。次に、保留中の結果ごとに get() を呼び出して、このリストを反復処理します。
私のクエリは次のとおりです: 100 個のスレッドすべてが完了するまで、順番に各 get() でブロックされませんか? これを行うより良い方法はありますか?
そして、 get() が Callable 実装の call() メソッドの結果を返すと仮定するのは正しいですか? デフォルトの FutureTask クラスを使用していますが、サブクラス化していません。
ExecutorService exec = Executors.newFixedThreadPool( NUM_THREADS );
List<JobClass> originalList = new ArrayList<JobClass>();
List<SomeOtherClass> pendingResult = new ArrayList<SomeOtherClass>();
List<Future<SomeOtherClass>> resultList = new ArrayList<Future<SomeOtherClass>>();
for( JobClass sc : originalList )
pendingResult.add( submit( sc );
for( Future<SomeOtherClass> future : futures )
resultList.add( future.get(5, TimeUnit.SECONDS) );