gpt4 book ai didi

servlets - Servlet 3.0中AsyncContext.start(...)的用途是什么?

转载 作者:行者123 更新时间:2023-12-03 12:45:38 24 4
gpt4 key购买 nike

Servlet API谈到“AsyncContext.start”:

void start(java.lang.Runnable run)

Causes the container to dispatch a thread, possibly from a managed thread pool, to run the specified Runnable. The container may propagate appropriate contextual information to the Runnable.



从这个描述中,尚不清楚当作业需要等待时,它与优化线程使用情况的任务有什么关系。

在“Servlet&JSP”中,Budi Kurniawan给出了Servlet 3.0异步功能的示例,其中他使用 AsyncContext.start,我将显示该示例的简化版本:
public void doGet(...) {
final AsyncContext asyncContext = request.startAsync();

asyncContext.start(new Runnable() {                        
@ Override
public void run() {
// do some work here which involves waiting
...
asyncContext.complete();
}
});
}

在我遇到的大多数其他示例中,服务方法只是将AsyncContext存储在某个地方,并在其他地方进行了处理(例如,通过后台线程)。在此示例中,作业似乎只是传递给另一个线程,从而完成了请求。据我了解,现在只是工作线程,这浪费了等待时间。

通过将工作(涉及等待)从一个线程传递到另一个线程,您是否真的从中获得了 yield ?如果不是,那么 AsyncContext.start(...)的目的是什么?

最佳答案

您发现一个不好的例子,恕我直言。实际上,我什至不知道 AsyncContext.start() 的存在。

我快速浏览了JettyTomcat如何实现这一点。实际上,它们似乎有一些线程池可以独立处理异步调用。

API的这种用法几乎没有给您任何帮助。而不是阻止HTTP线程,您正在阻止其他线程池。因此,我可以想象应用程序仍然接受新的连接,但是问题仍然存在-容器无法处理所有连接,因为额外的线程池仍然受到限制。
AsyncContext的全部要点是能够通过单个线程处理多个请求。通常,您只需要一个线程即可处理数千个异步连接-例如当恰好一个线程等待假定要广播给多个客户端的数据时。另请参阅The Limited Usefulness of AsyncContext.start()

关于servlets - Servlet 3.0中AsyncContext.start(...)的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10073392/

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