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

时间:2012-04-08 20:25:09

标签: servlets servlet-3.0

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

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

2 个答案:

答案 0 :(得分:16)

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

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

在servlet 3.0中,您可以拥有数千个具有少量HTTP线程的连接客户端。你可以在我的文章中找到一个真实世界的例子:Tenfold increase in server throughput with Servlet 3.0 asynchronous processing受到这个问题的启发:Restrict download file bandwidth/speed in Servlet

  

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

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

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

答案 1 :(得分:4)

使用servlet 3.0,您可以保持所有异步请求在ArrayList或某个队列中等待 问题是这个。您仍然需要一个新线程来处理请求并获取最终发送响应的请求。 所以我们释放http线程,但必须创建一些线程来处理请求