Ваш вопрос ужасно неполный, но от того, что мы можем предположить, что это вполне вероятно, что второй вариант занимает больше времени, если мы предположим, что currencyConvCF
представляет собой асинхронную операцию, которая может выполняться одновременно, пока выполняются ваши фрагменты кода, и вы говорите об общем времени, которое требуется для завершения всех операций, включая тот, который представлен CompletableFuture
, возвращенный thenApplyAsync
(earlyEarningsInHomeCountryCF
).
В первом варианте вы вызываете getYearlyEarningForUserWithEmployer
, а операция, представленная currencyConvCF
, может быть запущена одновременно. Умножение произойдет, когда обе операции будут завершены.
Во втором варианте getYearlyEarningForUserWithEmployer
вызов является частью операции, переданного currencyConvCF.thenApplyAsync
, таким образом, она не будет начинаться до операции, представленное currencyConvCF
была завершена, так что никакие операции не будут работать одновременно. Если предположить, что getYearlyEarningForUserWithEmployer
занимает значительное время, скажем одну секунду, и не имеет внутренних зависимостей для другой операции, неудивительно, когда общая операция занимает больше времени в этом варианте.
Кажется, что вы действительно хотите сделать что-то вроде:
CompletableFuture<Double> earlyEarningsInHomeCountryCF = currencyConvCF.thenCombineAsync(
CompletableFuture.supplyAsync(
() -> employmentService.getYearlyEarningForUserWithEmployer(userId, emp.getId())),
(currencyConv, yearlyEarnings) -> currencyConv * yearlyEarnings);
так getYearlyEarningForUserWithEmployer
не выполняется последовательно в инициирующей потоке, но обе операции источника могут работать асинхронно, прежде чем применяется окончательное умножение.
Однако, когда вы вызываете get
прямо в инициирующем потоке, как в вашем связанном коде github, эта асинхронная обработка второй операции не имеет преимущества. Вместо того, чтобы ждать завершения, ваш инициирующий поток может просто выполнить независимую операцию, поскольку второй вариант кода вашего вопроса уже выполняется, и вы, скорее всего, будете еще быстрее, если не создадите асинхронную операцию для чего-то столь же простого, как одно умножение, т.е. используйте вместо этого:
CompletableFuture<Double> currencyConvCF = /* a true asynchronous operation */
return employmentService.getYearlyEarningForUserWithEmployer(userId, emp.getId())
* employerCurrencyCF.join();
Можете ли вы дать фрагмент занятостиService.getYearlyEarningForUserWithEmployer() – Naruto
Как это сделать? – Robin
Пожалуйста, сделайте [mcve]. – Tunaki