1

私はまだJavaでFutureとCallableを使用することについて学んでいます。この質問に遭遇します:

クラスがあるとしましょう:

TaskWorker implements Callable {
  public String id;
  public TaskWorker(String id) {
     this.id = id;
  }

  public Documents call() trows Exception {
       //Assume here, that Search and Doc are my own method to search and retrieve docs
       Search search =  new Search();
       Documents docResult = search.process(id);

       //think about documents has getDocs
       //docResult.getDocs() will return number of document found from search

       return docResult;
  }
}

そしてここに主な方法があります:

public static void main(String[] args) {
   //assume here, that I build in request contains many Id

   Request request = new Request();
   request.process;

   ExecutorService service = Executors.newFixedThreadPool(3);
   List<Future<Documents>> result = new ArrayList<Future<Documents>>();

   for (int i=0;i<request.length;i++) {
       Callable<Documents> worker = new TaskWorker(request.getId[i]);
       Future<Documents> submit = executor.submit(worker);
       result.add(submit);
   }

   Response response = new Response();
   ArrayList<Documents> docList = new ArrayList<Documents>();

   for (Future<Documents> future:result) {
     docList.add(future.get().getDocs());
   }

   response.setDocuments(docList);
}

私がやろうとしているのは、各リクエストIDが個別の検索プロセスであるため、リクエストの一部を分割して個別のスレッドで実行することです。そのため、結果をfutureオブジェクトに格納することにより、Javaプーリングを利用しようとしています。

私が混乱しているのは、この場合、将来はどのように機能するのかということです。スレッドが完了するたびに、結果が保持されますか?そして、すべてのプロセスが終了した後、将来のオブジェクトをループして結果を正しく取得できますか?

また、プロセスが順番に(1、2、3、4など)実行されるという保証はありませんよね?その場合、元の各リクエストを将来の結果に関連付けたい場合の最善の戦略は何ですか?

お知らせ下さい。

ありがとう

4

2 に答える 2

2

また、プロセスが順番に(1、2、3、4など)実行されるという保証はありませんよね?その場合、元の各リクエストを将来の結果に関連付けたい場合の最善の戦略は何ですか?

バックグラウンドスレッドが開始および終了する順序はわかりませんが、result-ArrayListをループすると、もちろん、送信した順序で結果が得られます。ここで発生する可能性がある唯一のことは、このfuture-objectの特定の結果がまだ利用可能でない場合は、利用可能になるまで.get()がブロックされることです。

于 2010-10-29T15:06:30.240 に答える
0

SynchronizedMapを作成し、それをコンストラクターのTaskWorkerにRequestと一緒に渡す必要があります。TaskWorkerは、ジョブの終了時にリクエストと結果をマップに追加する必要があります。

結果を得るためにFuturesをループする必要はありません。すべてのジョブが終了していることを確認してください。

于 2010-10-29T14:54:22.613 に答える