Я пытаюсь использовать новый клиентский API HTTP от JDK 11, в частности его асинхронный способ выполнения запросов. Но есть кое-что, что я не уверен, что понимаю (вроде аспекта реализации). В документации говорится:
Асинхронные задачи и зависимые действия возвращенных экземпляров
CompletableFuture
выполняются в потоках, предоставленных клиентомExecutor
, где это практически возможно.
Насколько я понимаю, это означает, что если я создаю пользовательский исполнитель при создании объекта HttpClient
:
ExecutorService executor = Executors.newFixedThreadPool(3);
HttpClient httpClient = HttpClient.newBuilder()
.executor(executor) // custom executor
.build();
то, если я отправлю запрос асинхронно и добавлю зависимые действия в возвращаемом CompletableFuture
, зависимое действие должно выполняться на указанном исполнителе.
httpClient.sendAsync(request, BodyHandlers.ofString())
.thenAccept(response -> {
System.out.println("Thread is: " + Thread.currentThread().getName());
// do something when the response is received
});
Тем не менее, в зависимом действии выше (потребитель в thenAccept
), я вижу, что поток делает это из общего пула, а не из пользовательского исполнителя, так как он печатает Thread is: ForkJoinPool.commonPool-worker-5
.
Это ошибка в реализации? Или что-то мне не хватает? Я замечаю, что он говорит: "экземпляры выполняются в потоках, предоставленных клиентом Executor, где это практично ", так ли это случай, когда это не применяется?
Обратите внимание, что я также попробовал thenAcceptAsync
и это тот же результат.