同步:接收到一個請求后,tomcat 容器提供一個線程,線程調(diào)用servlet。
異步:請求異步處理后tomcat servlet線程立刻返回,自已啟動的線程執(zhí)行,這樣tomcat可以有較大的吞吐量。對前臺來說還是同步。
@WebServlet(asyncSupported = true, urlPatterns = { "/AsyncServlet" })
public class AsyncServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public AsyncServlet() {
super();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
long t1 = System.currentTimeMillis();
// 開啟異步
AsyncContext asyncContext = request.startAsync();
// 執(zhí)行業(yè)務代碼
CompletableFuture.runAsync(() -> doSomeThing(asyncContext,
asyncContext.getRequest(), asyncContext.getResponse()));
System.out.println("async use:" + (System.currentTimeMillis() - t1));
}
private void doSomeThing(AsyncContext asyncContext, ServletRequest servletRequest, ServletResponse servletResponse) {
// 模擬耗時操作
TimeUnit.SECONDS.sleep(5);
servletResponse.getWriter().append("done");
// 業(yè)務代碼處理完畢, 通知結(jié)束
asyncContext.complete();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
代碼:
git@github.com:lesline/servlet.git