Servlet API中关于"AsyncContext.start"的说明:
void start(java.lang.Runnable run)
导致容器派遣一个线程(可能来自托管线程池)运行指定的Runnable,容器可能会向该Runnable传递适当的上下文信息。
从这个描述中并不清楚它与在作业需要等待时优化线程使用的任务有何关系。
Budi Kurniawan在"Servlet&JSP"中提供了一个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存储在某个位置,并由其他地方(例如后台线程)处理。在这个示例中,似乎工作只是传递给另一个线程来完成请求。据我所知,现在只是工作线程在浪费时间等待。将涉及等待的任务从一个线程传递到另一个线程是否真正有所收获?如果没有,那么 AsyncContext.start(...) 的目的是什么?