Будущее против Завершаемого будущего?для этого варианта использования Completablefuture будет иметь значение? - PullRequest
0 голосов
/ 25 января 2019

У меня есть четыре службы.

One will give hotels which is matching to the query.
One will give City which is matching to the query.
One will give Airports which is matching to the query.
One will give Metro stations which is matching to the query.

Для каждого HTTP-запроса я получу эти четыре службы и объединю ответ четырех служб и вернусь.

Итак, мой пример кодаэто как

for(EntityGroups entityGroups: EntityGroups.values()){
            Callable<Response> callable = new XCallable(entityTypetoFetch, searchQuery);
            Future<List<Entity>> listFuture = executor.submit(callable);
            entityTypeAndFutureMap.put(entityTypetoFetch, listFuture);
        }

После этого я получаю весь ответ для цикла

trainStationList = entityTypeAndFutureMap.get(EntityGroups.TRAIN_STATION).get();
            landmarkEntities = entityTypeAndFutureMap.get(EntityGroups.LANDMARK_GROUP).get();
            cityEntities = entityTypeAndFutureMap.get(EntityGroups.CITY_GROUP).get();
            hotelEntities = entityTypeAndFutureMap.get(EntityGroups.HOTEL_GROUP).get();

Поскольку я хочу, чтобы весь список слился и сделал окончательный ответ.Я делаю блокирующий звонок.Я просто хочу объединить эти списки и вернуться.Если я использую здесь Completetablefuture, поможет ли это?

На данный момент загрузка моего процессора очень высока, когда я увеличиваю TPS.увеличение числа машин помогает, но все же есть ли оптимизированный способ решить эту проблему?

1 Ответ

0 голосов
/ 25 января 2019

A CompletableFuture имеет некоторые функциональные особенности, которых нет у обычного Future, например, возможность связывать выполнения с thenApply или thenAccept, которые принимают функцию, которая обрабатывает результат после его доступности.Вы также можете завершить CompleteableFuture из другого потока, вызвав метод comlete() для CompletableFuture.

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

Но если вам не нужны результаты дляпри дальнейшей обработке (например, вы просто хотите вставить результаты в базу данных) CompletableFuture будет иметь преимущество в том, что вы можете предоставить функцию, которая берет результат и что-то с ним делает.Например.вот так completableFuture.thenAccept(result -> DB::storeInDB); Таким образом, вам не нужно ждать результата с get().

...