【发布时间】:2020-11-06 15:05:41
【问题描述】:
我使用 CompletableFuture 在 github 中使用了 this sample。
我尝试同时从浏览器(chrome)中的多个选项卡运行 /asyncCompletable 端点。 关键是 Tomcat 是 Servlet 容器,它有自己的 Servlet 线程池,因此从浏览器的不同选项卡中访问相同的端点 url 不一定使用相同的主线程。请参阅下面的控制台日志:
8:07:07.334 [http-nio-9191-exec-8] Request received
18:07:07.335 [http-nio-9191-exec-8] Servlet thread released
18:07:07.335 [ForkJoinPool.commonPool-worker-3] Start processing request
18:07:08.262 [http-nio-9191-exec-7] Request received
18:07:08.262 [http-nio-9191-exec-7] Servlet thread released
18:07:08.262 [ForkJoinPool.commonPool-worker-4] Start processing request
18:07:08.860 [http-nio-9191-exec-9] Request received
18:07:08.861 [http-nio-9191-exec-9] Servlet thread released
18:07:08.861 [ForkJoinPool.commonPool-worker-5] Start processing request
18:07:09.376 [http-nio-9191-exec-10] Request received
18:07:09.377 [http-nio-9191-exec-10] Servlet thread released
正如您所见,它为同一 URL 的每个浏览器选项卡使用不同的线程,而不是重用已发布的线程以进行进一步的调用。 我的意思是它不会为下一个传入请求重用已发布的线程(例如 http-nio-9191-exec-7)。 这是为什么呢?
【问题讨论】:
-
为什么应该?
-
因为 CompletableFuture 保证当前线程(主线程)不会阻塞,并且对于任何异步调用都会分配一个新线程。但是从我的日志中可以看出,主线程(具有 http-nio-9191-exec- 前缀)并不相同,尽管在客户端调用时立即释放。
-
所以?您还没有解释为什么线程应该被立即重用,而不是(显然是这样)放入队列中以供重用。
-
所以你的意思是,它又被放到了线程池中,可供其他传入的请求使用?
-
这是我的猜测。你还没有解释为什么你期望你期望的特定行为。
标签: java spring-boot completable-future