どのようにJavaの先物は、「提出」されている受注を制御するには?

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

  •  26-09-2019
  •  | 
  •  

質問

この例では、私は私のコンパレータオブジェクトにいくつかのファイルを提出しています。それはすべて私は、ファイルが送信されているその順序は常にそれらが返される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()メソッド、ブロック必要に応じて呼び出します。

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