3

この例では、いくつかのファイルをコンパレータ オブジェクトに送信しています。ファイルが送信される順序が常に同じ順序で返されるとは限らないことに気付いたことを除いて、すべて正常に動作します。これをより適切に制御する方法について何か提案はありますか?

 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();
4

2 に答える 2

3

使用の主なポイントは、送信された順序に関係なく、終了しCompletionService.takeたものを返すようにすることです。Futureそれらを順番に戻したい場合は、それをまったく使用しないこともできます(まったく使用したくない場合もありますが、使用CompletionServiceできます)。Future返されたオブジェクトのリストを保持し、それぞれsubmit()を呼び出します。.get()結果が得られるまでブロックされます。

于 2010-06-10T18:44:32.457 に答える
0

一度に複数のタスクを ThreadPoolExecutor に送信する場合、それらのタスクは複数のスレッドによって同時に実行されるため、終了時間を実際に制御することはできません。完了サービスは、完了した順序でそれらを返します。これは、実行ごとに異なる場合があります。タスクを連続して実行することにした場合、完了順序はアクティブ化順序と同じです。

- 編集 -

同時実行が必要であるが、特定の順序でタスクを待ちたい場合は、完了サービスを使用しないでください。必要な順序で先物をループし、必要に応じてブロックする get() メソッドを呼び出すだけです。

于 2010-06-10T18:47:35.730 に答える