Я все еще учусь использовать Future и 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, сохраняя результат в будущем объекте.
Меня смущает то, как будущее будет работать в этом случае?
Для каждого завершения потока он будет содержать результаты? И после завершения процесса я могу просто зациклить будущий объект, чтобы получить правильные результаты?
Кроме того, нет никакой гарантии, что процесс будет работать по порядку (1,2,3,4 и т. Д.), Верно?
Если это так, то какова лучшая стратегия, если я хочу связать каждый исходный запрос с будущим результатом?
Пожалуйста, сообщите.
Спасибо