servlet源代码如下:
public class ServletDemo1 extends HttpServlet {
private ServletConfig config;
@Override
public void init(ServletConfig config){
this.config = config;
}
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println(Thread.currentThread().getName());
System.out.println(new Date());
System.out.println(request.getRemotePort());
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String thread = Thread.currentThread().getName();
ServletContext sc = this.config.getServletContext();
sc.setAttribute("data","milk");
String url = sc.getInitParameter("url");
String initName = this.config.getInitParameter("name");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet Written By Milk</TITLE></HEAD>");
out.println("<BODY>");
out.println("This is "+initName+url+"$"+thread+"$");
out.println(this.getClass());
out.println(",using the GET method");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
doGet(request,response);
}
}
地址后面加参数,比如
localhost:8080/sevlet/ServletDemo1?1
localhost:8080/sevlet/ServletDemo1?2
加了参数之后确实是三个线程了 而且并行执行的 但是还是不清楚不加参数为什么会串行 望解答
服务器处理请求的模式
1. 收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型
2. 收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,解决了主线程阻塞的问题,有了一定程度的并发量
3. 类似2的模型,但是不是每次收到请求就开一个新的线程,而是使用线程池。这种方式实现的服务器性能会比2高。
4. 基于Java NIO实现的服务器模型,它是基于IO多路复用技术(例如Reactor模式)实现,只需要一个线程或者少量线程,就可以处理大量请求。
omcat运行可以选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,如果想要换成NIO,可以配置server.xml