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