1

私は 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) ); 
4

2 に答える 2

5

良い質問です。私があなたを正しく理解していれば、あなたは完了したタスクの結果の消費について心配しています。はい、スレッドはブロックされます。これに対するJavaの答えは、CompletionServiceを使用することです。

ドキュメントページで述べたように、「新しい非同期タスクの生成を、完了したタスクの結果の消費から切り離すサービス」。

于 2011-09-07T16:05:33.470 に答える
2

すべてのタスクが完了した場合にのみ続行する場合は、提案したことを行うことができます。タスクがどの順序で完了するかは問題ではありません。ただし、タスクの結果をできるだけ早く他のプロセッサに渡す必要がある場合や、タスクの実行中に何か他のことを行う必要がある場合はisDone、たとえばメソッドを使用してタスクが完了したかどうかを最初に確認し、get()完了した場合は呼び出します。

于 2011-09-07T16:02:48.340 に答える