作用:可以先释放请求线程的资源,提高系统的吞吐量
AsyncContext asyncContext = request.startAsync(); // 创建一个异步上下文对象 asyncContext.addListener(new AsyncListener() { //设置监听器:可设置其开始、完成、异常、超时等事件的回调处理 @Override public void onTimeout(AsyncEvent event) throws IOException { System.out.println("超时了..."); } @Override public void onStartAsync(AsyncEvent event) throws IOException { System.out.println("线程开始"); } @Override public void onError(AsyncEvent event) throws IOException { System.out.println("发生错误:"+event.getThrowable()); } @Override public void onComplete(AsyncEvent event) throws IOException { System.out.println("执行完成"); } }); asyncContext.setTimeout(20000); //设置超时时间 asyncContext.start(new Runnable() { public void run() { try { Thread.sleep(10000); System.out.println("内部线程:" + Thread.currentThread().getName()); asyncContext.getResponse().setCharacterEncoding("utf-8"); asyncContext.getResponse().setContentType("text/html;charset=UTF-8"); asyncContext.getResponse().getWriter().println("这是异步的请求返回"); //异步请求完成通知 } catch (Exception e) { System.out.println("异常:"+e); } asyncContext.complete(); //此时整个请求才完成 } }); //此时之类 request的线程连接已经释放了 System.out.println("主线程:" + Thread.currentThread().getName());
创建一个异步请求的上下文对象(AsyncContextImpl),存储request response 设置回调,超时时间等
AsyncContextImpl启动了一个异步的runnable ,这个runnable对象,是在 processor.getExecutor().execute(runnable)启动
asyncStateMachine 异步sevlet使用了状态机的形式 后续有时间继续查看源码
当然,请求线程可以提前结束。