标签:
一.异步处理
1. 什么是异步处理
原来,在服务器没有结束响应之前,浏览器是看不到响应内容的!只有响应结束时,浏览器才能显示结果!
现在异步处理的作用:在服务器开始响应后,浏览器就可以看到响应内容,不用等待服务器响应结束!
?
2. 实现异步的步骤
* 得到AsyncContext,它异步上下文对象
AsyncContext ac = request.startAsync(request,response);
* 给上下文一个Runnable对象,启动它!(给上下文一个任务,让它完成!)
ac.start(new Runnable() {
public void run() {
...
}
});
注意:
* @WebServlet(urlPatterns="/AServlet", asyncSupported=true) //激活异步处理
* resp.setContentType("text/html;charset=utf-8"); //解决页面中文显示乱码问题
* IE如果不能正常输出,这说明响应体大小不足512B,那你需要多输出点废话!
* AsyncContext#complete():通知Tomcat我们异步线程已经执行结束了!这让Tomcat才会及时的断开与浏览器的连接!
实例:
Aservlet.java
/** * 添加WebServlet注解 *asyncSupported=true : 表示激活异步处理请求,servlet 默认是关闭的 */ @WebServlet(urlPatterns="/AServlet", asyncSupported=true) public class AServlet extends HttpServlet { //????public static void main(String[] args) { //????????System.out.println("hello"); //????????new Thread() { //????????????public void run() { //???????????????? //????????????} //????????}.start(); //???????? //????????System.out.println("不知道上面的线程是否结束!"); //????} ????public void doGet(final HttpServletRequest req, final HttpServletResponse resp) ????????????throws ServletException, IOException { ????????resp.setContentType("text/html;charset=utf-8"); ???????? ????// 支持IE!如果输出不足512B,没有异步效果! ????????for(int i = 0; i <= 512; i++) { ????????????resp.getWriter().print("a"); ????????} ????????resp.getWriter().flush(); ???????? ????????/* ???????? * 1. 得到异步上下文对象 ???????? */ ????????final AsyncContext ac = req.startAsync(req, resp); ???????? ????????/* ???????? * 2. 给上下文对象一个Runnable对象,让它执行这个任务 ???????? */ ????????ac.start(new Runnable() { ????????????public void run() { ????????????????println("现在马上开始<br/>", resp); ????????????????sleep(2000); ????????????????for(char c = ‘A‘; c <= ‘Z‘; c++) { ????????????????????println(c+"", resp); ????????????????????sleep(250); ????????????????} ???????????????? ????????????????/** ???????????????? * 通知Tomcat我们已经执行结束了!,如果不告诉tomcat ,那么请求处理完成之后, ???????????????? * tomcat依旧会保持和浏览器的接连一会儿,不会立即断开 ???????????????? */ ????????????????ac.complete(); ????????????} ????????}); ????} ???? ????//想客户端页面打印 信息 ????public void println(String text, HttpServletResponse resp) { ????????try { ????????????resp.getWriter().print(text); ????????????resp.getWriter().flush(); ????????} catch (IOException e) { ????????} ????} ???? ????//将 sleep 方法提取处理,单独处理异常 ????public void sleep(long ms) { ????????try { ????????????Thread.sleep(ms); ????????} catch (InterruptedException e) { ????????} ????} } |
?
????????????????
标签:
原文地址:http://www.cnblogs.com/Prozhu/p/5452703.html