Я пробую новый клиентский 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
.
Это ошибка в реализации? Или я что-то упускаю? Я заметил, что в нем говорится: «Экземпляры выполняются в потоках, предоставленных исполнителем клиента, там, где это целесообразно», так что это тот случай, когда это не применяется?
Обратите внимание, что я также пробовал thenAcceptAsync
, и результат тот же.
System.out.println(httpClient.executor().get().equals(executor));
в потребителеthenAccept
, и он печатаетtrue
. - person Naman   schedule 18.08.2018Thread.currentThread().getName()
внутриthenAccept
Consumer
, а имя указывает, чтоThread
взято из обычногоForkJoinPool
, а не из пользовательскогоExecutor
. Другими словами, OP не говорит, чтоExecutor
изHttpClient
изменился, OP задается вопросом, почему зависимый этапCompletableFuture
выполняется с использованием другого пула потоков. - person Slaw   schedule 18.08.2018httpClient.executor()
, этот метод просто возвращает исполнителя, который я указал при создании, а не то, что используетthenAccept
. - person M A   schedule 18.08.2018thenAccept
. Буду искать дополнительные сведения о там, где это целесообразно, а также о базе данных ошибок. - person Naman   schedule 18.08.2018