エグゼキューターサービスから複数の結果を効率的に処理するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/7336879

質問

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) ); 
役に立ちましたか?

解決

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

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top