У меня есть вопрос об использовании метода thenXXXX и thenXXXXAsyn c класса JDK 8 CompletableFuture. В соответствии с моим пониманием thenApply будет использовать тот же поток, что и ранее выполненные будущие, а thenApplyAsyn c использует любой поток из пула.
Code_1:
CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> tcf.task("FIRST"), executors)
.thenApply(a -> {
logger.log(Level.INFO, "Thread Id - 1 " + Thread.currentThread().getName());
////Some operations
})
.thenApply(a -> {
logger.log(Level.INFO, "Thread Id - 2 " + Thread.currentThread().getName());
////Some operations
});
Выход:
Идентификатор потока - 1: pool-1-thread-1
Идентификатор потока - 2: pool-1-thread-1
Код_2:
CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> tcf.task("FIRST"), executors)
.thenApplyAsync(a -> {
logger.log(Level.INFO, "Thread Id - 1 " + Thread.currentThread().getName());
////Some operations
}, executors)
.thenApplyAsync(a -> {
logger.log(Level.INFO, "Thread Id - 2 " + Thread.currentThread().getName());
////Some operations
}, executors);
Вывод:
Идентификатор потока - 1: pool-1-thread-2
Идентификатор потока - 2: pool-1-thread- 3
Какой наилучший подход использовать? В Code_2 задача перемещается из одного потока в другой. Влияет ли это на производительность?
спасибо