Java Future多线程如何返回结果?

时间:2010-10-29 14:38:39

标签: 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 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等),对吧? 如果是这种情况,那么如果我想将每个原始请求与未来结果相关联,那么最佳策略是什么?

请告知。

由于

2 个答案:

答案 0 :(得分:2)

  

此外,无法保证   进程将按顺序运行   (1,2,3,4等),对吗?如果那样的话   案例,那么什么是最好的策略   如果我想关联每个原件   请求未来结果?

您无法知道后台线程的启动和完成顺序,但是当您遍历结果ArrayList时,您将获得按照提交顺序的结果。这里唯一可能发生的是.get()将阻塞,直到此future-object的特定结果可用,如果尚未可用的话。

答案 1 :(得分:0)

您应该创建SynchronizedMap并将其与Request一起传递给构造函数中的TaskWorker。 TaskWorker应在完成作业时向地图添加请求和结果。

你不必循环期货来获得结果,只需确保所有工作都已完成。