我还在学习在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都是单独的搜索过程。 所以我试图通过将结果存储在未来的对象中来利用Java池。
我感到困惑的是,未来在这种情况下会如何运作? 对于每个线程完成,它是否会保留结果?在完成所有过程之后,我可以循环使用未来的对象来获得正确的结果吗?
此外,无法保证进程按顺序运行(1,2,3,4等),对吧? 如果是这种情况,那么如果我想将每个原始请求与未来结果相关联,那么最佳策略是什么?
请告知。
由于
答案 0 :(得分:2)
此外,无法保证 进程将按顺序运行 (1,2,3,4等),对吗?如果那样的话 案例,那么什么是最好的策略 如果我想关联每个原件 请求未来结果?
您无法知道后台线程的启动和完成顺序,但是当您遍历结果ArrayList时,您将获得按照提交顺序的结果。这里唯一可能发生的是.get()将阻塞,直到此future-object的特定结果可用,如果尚未可用的话。
答案 1 :(得分:0)
您应该创建SynchronizedMap并将其与Request一起传递给构造函数中的TaskWorker。 TaskWorker应在完成作业时向地图添加请求和结果。
你不必循环期货来获得结果,只需确保所有工作都已完成。