私はまだ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など)実行されるという保証はありませんよね?その場合、元の各リクエストを将来の結果に関連付けたい場合の最善の戦略は何ですか?
お知らせ下さい。
ありがとう