Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java未来的多线程如何返回结果?_Java_Multithreading_Future_Pooling - Fatal编程技术网

Java未来的多线程如何返回结果?

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

我仍在学习如何在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);
}
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终止所有缓存的后台线程之前,您的程序不会退出。