1. 阻塞与并发

Servlet 3.0之前的请求访问模型都是阻塞式的,一个请求未处理完就不能进行下一个请求,请求之间是排队进行的:

[图-阻塞式请求-响应模型]

 

一个典型的阻塞式Servlet如下:

package cc11001100.servlet.study; 

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={"/foo"})
public class FooServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {
System.out.println(Thread.currentThread()+" : "+System.currentTimeMillis());
/*这里模拟调用了其它的服务,耗费了巨量的时间*/
TimeUnit.SECONDS.sleep(10);
System.out.println(Thread.currentThread()+" : "+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
resp.getWriter().write("Response success done!");
}
}

我们同时打开两个网页进行观察,可以看到第一个请求未处理完的时候第二个一直处在等待状态:

[图-阻塞住了]

如果当并发量很大的时候这肯定要gg的,同一时间只能处理一个请求是硬伤...Servlet 3.0为我们提供了异步处理的方法,在配置Servlet的时候有一个asyncSupported选项,当此选项配置为true的时候可以使用一个AsyncContext对象来将原线程返回