2012-04-08 80 views

回答

15

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

使用servlet 3.0,您可以提供数千个并发连接,远远超过可用线程。想想一个能够提供有限吞吐量下载文件的应用程序。大多数时候你的线程都处于空闲状态,因为它们正在等待发送下一块数据。在普通的servlet中,即使大部分时间这些线程都处于空闲/休眠状态,您仍然无法为更多的客户端提供比HTTP线程更多的客户端。

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

是由startAsync创建线程不知何故便宜?

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

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

+0

谢谢!这很有道理:) – Aivar 2012-04-09 07:31:53

+0

...但不幸的是,它对我来说还不完全清楚。看起来我很困惑,因为我学习了AsyncContext的例子。我写了关于这个问题的另一个问题,也许你也可以看看这个:http://stackoverflow.com/questions/10073392/whats-the-purpose-of-asynccontext-start-in-servlet-3-0 – Aivar 2012-04-09 12:48:45

4

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

相关问题