gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:09:21 25 4
gpt4 key购买 nike

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

似乎我错过了一些东西,因为我不明白,为什么不直接使用 servlet 线程来工作? startAsync 创建的线程是否更便宜?

最佳答案

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

使用 servlet 3.0,您可以为数千个并发连接提供服务,这比可用线程多得多。考虑一个以有限吞吐量提供文件下载的应用程序。大多数时候,您的线程处于空闲状态,因为它们正在等待发送下一个数据 block 。在普通的 servlet 中,您无法为超过 HTTP 线程数量的客户端提供服务,即使大多数时间这些线程处于空闲/ sleep 状态。

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

Is the thread created by startAsync somehow cheaper?

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

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

关于servlets - 为什么使用 startAsync 创建新线程而不是在 servlet 线程中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10066199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com