tomcat线程池用尽会怎样

用tomcat好多年,我居然不知道tomcat的线程池在那儿设置。在此记录下,并做个测试,当超过这个线程池大小会发现什么事情。配置在server.xml,如下:
 <Connector URIEncoding="UTF-8" connectionTimeout="20000" maxThreads="150" port="80" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>

就是这个maxThreads了,需要注意的是这个并不是指tomcat整个进程下最多有多少个线程,而是tomcat能提供http服务的最大线程数。
测试的例子是这样的,先写个页面来显示当前线程名与进程总的线程数,如下view.jsp:
<%
out.println(Thread.currentThread().getName()+"
");
out.println(Thread.activeCount());
%>

再写一个一直阻塞的页面index.jsp:
<%
try{	
	Thread.sleep(10000000);
}catch(Exception e){	
}
%>

最后再写一个请求这个阻塞页面的main函数:
while (true) {
	for (int i = 0; i < 10; i++) {
		new Thread() {
			public void run() {
				try {					
					URL url = new URL(
							"http://localhost/test/index.jsp");
					HttpURLConnection conn = (HttpURLConnection) url
							.openConnection();
					conn.setRequestMethod("GET");
					conn.setConnectTimeout(5000);				
					int code = conn.getResponseCode();
					System.out.println("code" + code);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}.start();

	}
	Thread.sleep(1000);
}

先启动tomcat,可观察到view.jsp显示"http-bio-80-exec-2 11"的字样,再启动上面的main函数。每隔一两秒刷这个view.jsp就会发现最终线程数停留在150多,再查看控制台就能查到如下异常:
如遇到这样的异常,可能就是tomcat线程池用光了。
文/中中 浏览次数:0次   2016-11-11 21:13:15

相关阅读

微信扫描-捐赠支持
加入QQ群-技术交流

评论: