返回的
CompletableFuture
实例的异步任务和依赖操作在客户端提供的Executor
线程上执行,如果可行。
据我理解,这意味着如果我在创建HttpClient
对象时设置了自定义执行程序,则会在该执行程序提供的线程上执行CompletableFuture
实例的异步任务和依赖操作:
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
中的consumer)中,我看到执行它的线程来自于公共池而不是自定义执行器,因为它打印了Thread is: ForkJoinPool.commonPool-worker-5
。这是实现中的错误吗?还是我漏掉了什么?我注意到它说“实例在客户端提供的Executor上执行,如果可行的话”,那么这是否是一个没有应用这一点的情况?
请注意,我还尝试了
thenAcceptAsync
,结果相同。
System.out.println(httpClient.executor().get().equals(executor));
,它打印出“true”。 - NamanthenAccept
的Consumer
中打印了Thread.currentThread().getName()
,而线程名称表明该Thread
来自公共的ForkJoinPool
而不是自定义的Executor
。换句话说,OP 并没有说HttpClient
的Executor
已经 _改变_,而是想知道为什么依赖的CompletableFuture
阶段会使用不同的线程池来执行。 - SlawhttpClient.executor()
,此方法只返回我在创建时指定的执行程序,而这不是thenAccept
使用的执行程序。 - M AthenAccept
中没有被使用。我会进一步寻找关于“在实践中”的细节以及错误数据库的信息。 - Naman