どのようにJavaの先物は、「提出」されている受注を制御するには?
質問
この例では、私は私のコンパレータオブジェクトにいくつかのファイルを提出しています。それはすべて私は、ファイルが送信されているその順序は常にそれらが返されるtehのと同じ順序ではない気づいたことを除いて、罰金を動作します。私はこれをよりよく制御することができますか?
上の任意の提案 ExecutorService pool = Executors.newFixedThreadPool(5);
CompletionService<Properties> completion = new ExecutorCompletionService<Properties>(pool);
for (String target : p.getTargetFiles()) {
completion.submit(new PropertiesLoader(target, p));
}
for (@SuppressWarnings("unused")
String target : p.getTargetFiles()) {
Properties r = null;
try {
r = completion.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
p.addTargetFilesProperties(r);
}
pool.shutdown();
解決
CompletionService.take
を使用しての主なポイントは、それは、彼らが提出されたどのような順序に関係なく完了した方Future
返すことです。あなたが順序でそれらを返すようにしたい場合は、同様に(あなたもまったくCompletionService
を使用したくないかもしれませんが、することができます)すべてのそれを使用しない場合があります。それぞれのFuture
と呼び出しsubmit()
から返さ.get()
オブジェクトのリストを保管してください。結果が利用可能になるまでそれがブロックします。
他のヒント
一度にThreadPoolExecutorに複数のタスクを送信するとき、彼らは同時に複数のスレッドによって実行されているので、
は、あなたが、終了時間には実際のコントロールを持っていません。 完了サービスは、別の実行と異なる場合があり、彼らは完全な順序でそれらを返します。あなたは逐次タスクを実行することを決定した場合、完了順序は、起動順序と同じである。
- EDIT -
あなたはまだ完了サービスを使用していない、並行処理をしたいが、特定の順序でタスクを待ちたい場合。単純に必要な順序で先物ループ、およびそのget()メソッド、ブロック必要に応じて呼び出します。
所属していません StackOverflow