Java未来的多线程如何返回结果?
我仍在学习如何在Java中使用Future和Callable。 跌跌撞撞地问这个问题: 假设我有课:Java未来的多线程如何返回结果?,java,multithreading,future,pooling,Java,Multithreading,Future,Pooling,我仍在学习如何在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
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);
}
publicstaticvoidmain(字符串[]args){
//这里假设我的内置请求包含许多Id
请求=新请求();
请求处理;
ExecutorService=Executors.newFixedThreadPool(3);
列表结果=新建ArrayList();
对于(int i=0;i您应该创建SynchronizedMap,并将其与请求一起传递给构造函数中的TaskWorker。TaskWorker应该在完成作业后将请求和结果添加到映射中
你不必通过循环期货来获得结果,只要确保所有的工作都完成就行了
此外,也不能保证
进程将按顺序运行
(1,2,3,4等),对吗?如果
如果是这样,那么最好的策略是什么
如果我想将每个原件关联起来
请求未来的结果
您无法知道后台线程的启动和完成顺序,但是当您循环遍历结果数组列表时,您当然会按照您提交的顺序获得结果。这里唯一可以发生的事情是.get()将阻止,直到此未来对象的特定结果可用为止(如果尚未可用)。哦,我明白了。关于线程安全问题,是否有理由担心使用Arraylist而不是Vector?当然,我忘了关闭ExecutorService。假设,我需要将它们放在未来循环之后,对吗?您不必担心关于结果ArrayList的线程安全性,因为它只能从一个线程(主线程)访问,而不能从任何后台线程访问。您应该在以后的循环后关闭ExecutorService。否则,在executor终止所有缓存的后台线程之前,您的程序不会退出。