程序1
package com.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.threads.ComputeThread;
/*
-
对于异步上下文队象的结束方式总结:
-
1、在异步子线程中使用ac.complete()方法:该方法用于结束异步操作,并将与当前异步对象相关的request与response对象销毁
-
2、在异步子线程中使用ac.dispatch()方法:该方法在结束异步操作同时,会将参数所指定的页面内容包含到当前异步对象相关的标准输出流中,
-
其执行效果相当于请求转发里的include()方法的执行效果
-
3、在异步servlet主线程中设置ac的超时时限,当超时时限到达时,异步对象及其相关的request与response销毁
*/
@WebServlet("/some")
public class SomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应字符编码utf-8
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
out.println(“主线程开始运行!
”);//子线程执行 ComputeThread computeThread = new ComputeThread(out); Thread subThread = new Thread(computeThread); subThread.start(); try { Thread.sleep(15000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.println("主线程结束运行!<br>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}扫描二维码关注公众号,回复: 10713977 查看本文章
}
package com.threads;
import java.io.PrintWriter;
public class ComputeThread implements Runnable {
private PrintWriter out;
public ComputeThread(PrintWriter out) {
super();
this.out = out;
}
@Override
public void run() {
out.println("子线程开始运行!<br>");
int sum = 0;
try {
for (int i = 1; i <= 10; i++) {
System.out.println(i);
sum = sum + i;
Thread.sleep(1000);
}
} catch (Exception e) {
// TODO: handle exception
}
out.println("sum = " + sum + "<br>");
out.println("子线程结束运行!<br>");
}
}
程序2
package com.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.threads.ComputeThread;
//asyncSupported=true表示当前servlet支持异步处理
@WebServlet(value="/some",asyncSupported=true)
public class SomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应字符编码utf-8
response.setContentType(“text/html;charset=utf-8”);
PrintWriter out = response.getWriter();
out.println(“主线程开始运行!
”);
//获取异步上下文对象
AsyncContext ac = request.startAsync();
//子线程执行
ComputeThread computeThread = new ComputeThread(ac);
//设置异步上下文超时时间,默认为30秒
//ac.setTimeout(3000);
//设置异步对象监听器
ac.addListener(new AsyncListener() {
@Override
public void onTimeout(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
System.out.println("异步操作已超时");
}
@Override
public void onStartAsync(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
System.out.println("异步操作已开始");
}
@Override
public void onError(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
System.out.println("异步操作出现错误");
}
@Override
public void onComplete(AsyncEvent event) throws IOException {
// TODO Auto-generated method stub
System.out.println("异步操作已完成");
}
});
//开启异步上下文对象
ac.start(computeThread);
out.println("主线程结束运行!<br>");
out.println("请到邮箱查看链接!<br>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
package com.threads;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class ComputeThread implements Runnable {
private AsyncContext ac;
public ComputeThread(AsyncContext ac) {
super();
this.ac = ac;
}
@Override
public void run() {
try {
HttpServletRequest request = (HttpServletRequest) ac.getRequest();
HttpSession session = request.getSession();
int sum = 0;
for (int i = 1; i <= 10; i++) {
System.out.println(i);
sum = sum + i;
Thread.sleep(1000);
}
session.setAttribute("sum", sum);
ac.complete();
} catch (Exception e) {
// TODO: handle exception
}
}
}
程序3
package com.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.threads.ComputeThread;
//asyncSupported=true表示当前servlet支持异步处理
@WebServlet(value="/register",asyncSupported=true)
public class RegisterServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取异步上下文对象
AsyncContext ac = request.startAsync();
//子线程执行
ComputeThread ct = new ComputeThread(ac);
//设置异步上下文超时时间,默认为30秒
ac.setTimeout(3000);
//开启异步上下文对象
ac.start(ct);
//主线程结束后给客户端的信息
response.getWriter().println("please login your email to check result!");
}
}
package com.threads;
import java.io.PrintWriter;
import javax.servlet.AsyncContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class ComputeThread implements Runnable {
private AsyncContext ac;
public ComputeThread(AsyncContext ac) {
super();
this.ac = ac;
}
@Override
public void run() {
try {
HttpServletRequest request = (HttpServletRequest) ac.getRequest();
HttpSession session = request.getSession();
int sum = 0;
for (int i = 1; i <= 10; i++) {
System.out.println("i = " + i);
sum = sum + i;
Thread.sleep(1000);
}
//对运算结果进行分析
String message = "注册失败,请重新进行注册!";
if(sum == 55) {
message = "恭喜,注册成功!";
}
//将分析结果存放到session
session.setAttribute("message", message);
ac.complete();
} catch (Exception e) {
// TODO: handle exception
}
}
}