今天我看到了一些使用 Executors.newSingleThreadScheduledExecutor() 在每个请求的基础上轮询REST API的最终状态(想想 COMPLETE , FAILED 知道servlet容器已经是一个高度并发的环境,我担心每个请求线程都在创建另一个线程。
Executors.newSingleThreadScheduledExecutor()
COMPLETE
FAILED
我已经考虑过创建一个固定大小的线程池,但我不确定它是否必须以servlet容器特定的方式进行管理。我不确定如何决定最佳尺码。我也不完全相信这是正确的做法。
我想通过解释原因来确认这确实是危险的,并理解高级解决方案可能是什么样子。
servlet AsyncContext.start(Runnable) 如果您希望从您的 Runnable (这将在Servlet容器的线程池中运行,并允许容器管理线程周围的各种上下文,如类加载器、安全性、cdi、会话等)。
AsyncContext.start(Runnable)
Runnable
AsyncContext 方法是使用Servlet容器线程来进行处理。如果您还使用Servlet异步I/O,那么您已经大大抵消了这一负面影响,而且您的扩展能力实际上会有显著的提高。
AsyncContext
如果您不需要从您的 可跑步 ,然后使用从Java获得的线程池中执行的简单线程 Executors 。
可跑步
Executors