在 servlet 3.0 中,可以使用 startAsync 将长时间的工作放在另一个线程中,这样您就可以释放 servlet 线程。
似乎我错过了一些东西,因为我没有看到,为什么不直接使用 servlet 线程来工作呢?startAsync 创建的线程是否更便宜?
在 servlet 3.0 中,可以使用 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 线程,但必须创建一些线程来处理请求