Servlet API谈到“AsyncContext.start”:



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

在“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()

09-05 14:53