为什么用startAsync创建新线程而不是在servlet线程中工作?

Aiv*_*var 5 servlets servlet-3.0

在servlet 3.0中,可以使用startAsync将长时间的工作放在另一个线程中,这样就可以释放servlet线程.

似乎我错过了一些东西,因为我没有看到,为什么不只是使用servlet线程来工作?startAsync创建的线程是否更便宜?

Tom*_*icz 16

在大多数情况下,处理请求时您会阻塞或等待某些外部资源/条件.在这种情况下,您占用线程(因此需要大量内存)而不做任何工作.

使用servlet 3.0,您可以提供数千个并发连接,远远超过可用线程.考虑一个提供有限吞吐量的文件下载的应用程序.大多数情况下,您的线程处于空闲状态,因为它们正在等待发送下一个数据块.在普通的servlet中,除了HTTP线程的数量之外,你不能提供更多的客户端,即使大多数时候这些线程处于空闲/休眠状态.

在servlet 3.0中,您可以拥有数千个具有少量HTTP线程的连接客户端.您可以在我的文章中找到一个真实世界的示例:受此问题启发的Servlet 3.0异步处理,服务器吞吐量增加十倍:限制Servlet中的下载文件带宽/速度

startAsync创建的线程是否更便宜?

没有创建的线程startAsync!它只是告诉servlet容器:嘿,虽然doGet/ doPost方法完成了,我没有完成这个请求,请不要关闭.这就是重点 - 您可能不会为每个异步请求创建新线程.这是另一个例子 - 你有成千上万的浏览器在等待使用的股票价格变化.在标准的servlet中,这意味着:数千个空闲线程在等待某个事件.

使用servlet 3.0,您可以保持所有异步请求在一个ArrayList或一些队列中等待.当股票价格变化到来时,一个接一个地发送给所有客户.在这种情况下,只需要一个线程 - 所有HTTP线程都可以自由处理剩余资源.