在servlet 3.0中,可以使用startAsync将长时间工作放在另一个线程中,以便释放servlet线程。为什么用startAsync创建新线程而不是在servlet线程中工作?
似乎我失去了一些东西,因为我没有看到,为什么不只是使用servlet线程工作?由startAsync创建的线程以某种方式更便宜?
在servlet 3.0中,可以使用startAsync将长时间工作放在另一个线程中,以便释放servlet线程。为什么用startAsync创建新线程而不是在servlet线程中工作?
似乎我失去了一些东西,因为我没有看到,为什么不只是使用servlet线程工作?由startAsync创建的线程以某种方式更便宜?
在处理请求的大多数情况下,您正在阻止或等待某些外部资源/条件。在这种情况下,你正在占用线程(因此有很多内存)而没有做任何工作。
使用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
方法完成,但我没有完成这个请求,请不要关闭。这是重点 - 你可能不会每个异步请求创建新的线程。这里是另一个例子 - 您有成千上万的浏览器使用comet等待股价变化。在标准servlet中,这意味着:数千个等待某个事件的空闲线程。
使用servlet 3.0,您可以将所有异步请求保留在ArrayList
或某个队列中。当股票价格变动到来时,一个接一个地发送给所有的客户。在这种情况下不需要超过一个线程 - 并且所有HTTP线程都可以自由处理剩余的资源。
使用servlet 3.0,您可以保持在ArrayList或某个队列中等待的所有异步请求 问题是这样的。您仍然需要一个新的线程来处理请求并提取最终发送响应的请求。 所以我们释放了http线程,但必须创建一些线程来处理请求
谢谢!这很有道理:) – Aivar 2012-04-09 07:31:53
...但不幸的是,它对我来说还不完全清楚。看起来我很困惑,因为我学习了AsyncContext的例子。我写了关于这个问题的另一个问题,也许你也可以看看这个:http://stackoverflow.com/questions/10073392/whats-the-purpose-of-asynccontext-start-in-servlet-3-0 – Aivar 2012-04-09 12:48:45