Как результат возврата Java будущего многопотативного возвращения?

StackOverflow https://stackoverflow.com/questions/4052859

Вопрос

Я все еще узнаю об использовании будущего и Callable в Java. Наткнуться на этот вопрос:

Скажем, у меня есть класс:

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);
}

То, что я пытаюсь сделать, сломав часть запроса для запуска в отдельной нити, поскольку каждый из идентификаторов запроса является отдельный процесс поиска. Поэтому я пытаюсь использовать Java Moowning, хранив результат в будущем объекте.

То, что я запутался, как будущее будет работать в этом случае? Для каждого завершения потока есть ли удерживать результаты? И ведь после завершения процесса я могу просто лосить будущий объект, чтобы получить результаты правильно?

Кроме того, нет никакой гарантии, что процесс будет работать по порядку (1,2,3,4 и т. Д.), Верно? Если это так, то какова лучшая стратегия, если я хочу связать каждый оригинальный запрос с будущим результатом?

Пожалуйста, порекомендуйте.

Спасибо

Это было полезно?

Решение

Кроме того, нет никакой гарантии, что процесс будет работать по порядку (1,2,3,4 и т. Д.), Верно? Если это так, то какова лучшая стратегия, если я хочу связать каждый оригинальный запрос с будущим результатом?

Вы не можете знать порядок, в котором запускаются фоновые потоки и завершены, но когда вы поступаете через ваш результат - Arraylist, вы получите, конечно, результаты в том порядке, которому вы их представили. Единственное, что может произойти вот то, что .get () заблокирует, пока конкретный результат этого будущего объекта не будет доступен, если еще не доступен.

Другие советы

Вы должны создавать синхронизированныеMAP и передавать его для Cassworker в конструкторе вместе с запросом. Cassworker должен добавить запрос и привести к карте, когда она заканчивает работу.

Вам не нужно вести фьючерсы, чтобы получить результаты, просто убедитесь, что все работы закончены.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top