linux下的测试
安装tomcat,略过
ps -ef|grep tomcat
显示所有的tomcat进程,先执行ps -ef 获取所有的进程,再执行过滤出来带有tomcat关键字的进程。
ps -ef|grep tomcat|grep -v grep
-v:过滤掉grep的行,也就是过滤掉本次执行查询进程的行。
具体步骤:
进入tomcat安装目录
cd /opt/apache-tomcat-7.0.94/bin
运行tomcat
sudo ./startup.sh
查询tomcat进程
ps -ef|grep tomcat|grep -v grep
发现只有一个进程
root 6834 1726 99 14:59 pts/3 00:00:03 /usr/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-7.0.94/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Dignore.endorsed.dirs= -classpath /opt/apache-tomcat-7.0.94/bin/bootstrap.jar:/opt/apache-tomcat-7.0.94/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache-tomcat-7.0.94 -Dcatalina.home=/opt/apache-tomcat-7.0.94 -Djava.io.tmpdir=/opt/apache-tomcat-7.0.94/temp org.apache.catalina.startup.Bootstrap start
sudo ./shutdown.sh
查询tomcat进程
ps -ef|grep tomcat|grep -v grep
发现查询不到tomcat进程了,已成功关闭
实验
实验一:在http请求后开启一个一直运行的线程
代码如下:
@WebServlet("/HelloWorld")
public class HelloWorld extends HttpServlet {
private String message;
@Override
public void init() throws ServletException {
message = "Hello world, this message is from servlet!";
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应内容类型
resp.setContentType("text/html");
//设置逻辑实现
PrintWriter out = resp.getWriter();
out.println("<h1>" + message + "</h1>");
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.currentThread().setName("print 1");
Thread.sleep(1000);
System.out.println("1234");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.currentThread().setName("print 2");
Thread.sleep(1000);
System.out.println("2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.currentThread().setName("print 3");
Thread.sleep(1000);
System.out.println("3");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
启动web应用,查询得到tomcat进程,并把当前线程堆栈信息保存下来
ps -ef|grep tomcat|grep -v grep
jstack -l 12883 > jstack1.log
访问HelloWorld路径
再次保存堆栈信息
此时控制台同时在运行三个线程打印输出
jstack -l 12883 > jstack2.log
对比log文件的不同
1c1
< 2019-06-21 15:00:31
---
> 2019-06-21 15:04:47
4c4
< "Attach Listener" #51 daemon prio=9 os_prio=0 tid=0x00007fb9bc001000 nid=0x31d8 waiting on condition [0x0000000000000000]
---
> "Attach Listener" #55 daemon prio=9 os_prio=0 tid=0x00007f2d70001000 nid=0x33f7 waiting on condition [0x0000000000000000]
10c10,37
< "localhost-startStop-1" #50 daemon prio=5 os_prio=0 tid=0x00007fb980002000 nid=0x31c7 waiting on condition [0x00007fb9d98cf000]
---
> "print 3" #54 daemon prio=5 os_prio=0 tid=0x00007f2d10004800 nid=0x33cb waiting on condition [0x00007f2d49d8c000]
> java.lang.Thread.State: TIMED_WAITING (sleeping)
> at java.lang.Thread.sleep(Native Method)
> at com.kiroscarlet.controller.HelloWorld$3.run(HelloWorld.java:69)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "print 2" #53 daemon prio=5 os_prio=0 tid=0x00007f2d10003000 nid=0x33ca waiting on condition [0x00007f2d4befd000]
> java.lang.Thread.State: TIMED_WAITING (sleeping)
> at java.lang.Thread.sleep(Native Method)
> at com.kiroscarlet.controller.HelloWorld$2.run(HelloWorld.java:54)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "print 1" #52 daemon prio=5 os_prio=0 tid=0x00007f2d10002000 nid=0x33c9 waiting on condition [0x00007f2d642c7000]
> java.lang.Thread.State: TIMED_WAITING (sleeping)
> at java.lang.Thread.sleep(Native Method)
> at com.kiroscarlet.controller.HelloWorld$1.run(HelloWorld.java:39)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "RMI TCP Connection(idle)" #51 daemon prio=5 os_prio=0 tid=0x00007f2d5c003800 nid=0x33b4 waiting on condition [0x00007f2d4bffe000]
13c40
< - parking to wait for <0x000000008751a338> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087479fd0> (a java.util.concurrent.SynchronousQueue$TransferStack)
15,16c42,44
< at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
< at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
---
> at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
> at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
> at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
25c53
< "ajp-bio-8009-AsyncTimeout" #44 daemon prio=5 os_prio=0 tid=0x00007fb9f8629800 nid=0x3149 waiting on condition [0x00007fb9b0efc000]
---
> "ajp-bio-8009-AsyncTimeout" #44 daemon prio=5 os_prio=0 tid=0x00007f2da85cb000 nid=0x3296 waiting on condition [0x00007f2d49e8d000]
34c62
< "ajp-bio-8009-Acceptor-0" #43 daemon prio=5 os_prio=0 tid=0x00007fb9f8627800 nid=0x3148 runnable [0x00007fb9b0ffd000]
---
> "ajp-bio-8009-Acceptor-0" #43 daemon prio=5 os_prio=0 tid=0x00007f2da85c9800 nid=0x3295 runnable [0x00007f2d49f8e000]
47c75
< "ajp-bio-8009-exec-10" #42 daemon prio=5 os_prio=0 tid=0x00007fb9f8625800 nid=0x3147 waiting on condition [0x00007fb9d81b8000]
---
> "ajp-bio-8009-exec-10" #42 daemon prio=5 os_prio=0 tid=0x00007f2da85c7800 nid=0x3294 waiting on condition [0x00007f2d4a08f000]
50c78
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
65c93
< "ajp-bio-8009-exec-9" #41 daemon prio=5 os_prio=0 tid=0x00007fb9f8623800 nid=0x3146 waiting on condition [0x00007fb9d82b9000]
---
> "ajp-bio-8009-exec-9" #41 daemon prio=5 os_prio=0 tid=0x00007f2da85c5800 nid=0x3293 waiting on condition [0x00007f2d4a190000]
68c96
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
83c111
< "ajp-bio-8009-exec-8" #40 daemon prio=5 os_prio=0 tid=0x00007fb9f8622000 nid=0x3145 waiting on condition [0x00007fb9d83ba000]
---
> "ajp-bio-8009-exec-8" #40 daemon prio=5 os_prio=0 tid=0x00007f2da85c3800 nid=0x3292 waiting on condition [0x00007f2d4a291000]
86c114
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
101c129
< "ajp-bio-8009-exec-7" #39 daemon prio=5 os_prio=0 tid=0x00007fb9f8620000 nid=0x3144 waiting on condition [0x00007fb9d84bb000]
---
> "ajp-bio-8009-exec-7" #39 daemon prio=5 os_prio=0 tid=0x00007f2da85c1800 nid=0x3291 waiting on condition [0x00007f2d4a392000]
104c132
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
119c147
< "ajp-bio-8009-exec-6" #38 daemon prio=5 os_prio=0 tid=0x00007fb9f861e000 nid=0x3143 waiting on condition [0x00007fb9d85bc000]
---
> "ajp-bio-8009-exec-6" #38 daemon prio=5 os_prio=0 tid=0x00007f2da85bf800 nid=0x3290 waiting on condition [0x00007f2d4a493000]
122c150
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
137c165
< "ajp-bio-8009-exec-5" #37 daemon prio=5 os_prio=0 tid=0x00007fb9f861c000 nid=0x3142 waiting on condition [0x00007fb9d86bd000]
---
> "ajp-bio-8009-exec-5" #37 daemon prio=5 os_prio=0 tid=0x00007f2da85bd800 nid=0x328f waiting on condition [0x00007f2d4a594000]
140c168
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
155c183
< "ajp-bio-8009-exec-4" #36 daemon prio=5 os_prio=0 tid=0x00007fb9f861a000 nid=0x3141 waiting on condition [0x00007fb9d87be000]
---
> "ajp-bio-8009-exec-4" #36 daemon prio=5 os_prio=0 tid=0x00007f2da85bb800 nid=0x328e waiting on condition [0x00007f2d4a695000]
158c186
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
173c201
< "ajp-bio-8009-exec-3" #35 daemon prio=5 os_prio=0 tid=0x00007fb9f8618000 nid=0x3140 waiting on condition [0x00007fb9d88bf000]
---
> "ajp-bio-8009-exec-3" #35 daemon prio=5 os_prio=0 tid=0x00007f2da85ba000 nid=0x328d waiting on condition [0x00007f2d4a796000]
176c204
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
191c219
< "ajp-bio-8009-exec-2" #34 daemon prio=5 os_prio=0 tid=0x00007fb9f8616800 nid=0x313f waiting on condition [0x00007fb9d89c0000]
---
> "ajp-bio-8009-exec-2" #34 daemon prio=5 os_prio=0 tid=0x00007f2da85b8000 nid=0x328c waiting on condition [0x00007f2d4a897000]
194c222
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
209c237
< "ajp-bio-8009-exec-1" #33 daemon prio=5 os_prio=0 tid=0x00007fb9f8615000 nid=0x313e waiting on condition [0x00007fb9d8ac1000]
---
> "ajp-bio-8009-exec-1" #33 daemon prio=5 os_prio=0 tid=0x00007f2da85b7000 nid=0x328b waiting on condition [0x00007f2d4a998000]
212c240
< - parking to wait for <0x0000000087406660> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087489518> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
227c255
< "http-bio-8080-AsyncTimeout" #32 daemon prio=5 os_prio=0 tid=0x00007fb9f8613000 nid=0x313d waiting on condition [0x00007fb9d8bc2000]
---
> "http-bio-8080-AsyncTimeout" #32 daemon prio=5 os_prio=0 tid=0x00007f2da85b5000 nid=0x328a waiting on condition [0x00007f2d4aa99000]
236c264
< "http-bio-8080-Acceptor-0" #31 daemon prio=5 os_prio=0 tid=0x00007fb9f8611000 nid=0x313c runnable [0x00007fb9d8cc3000]
---
> "http-bio-8080-Acceptor-0" #31 daemon prio=5 os_prio=0 tid=0x00007f2da85b3000 nid=0x3289 runnable [0x00007f2d4ab9a000]
249c277
< "http-bio-8080-exec-10" #30 daemon prio=5 os_prio=0 tid=0x00007fb9f860f000 nid=0x313b waiting on condition [0x00007fb9d8dc4000]
---
> "http-bio-8080-exec-10" #30 daemon prio=5 os_prio=0 tid=0x00007f2da85b0800 nid=0x3288 waiting on condition [0x00007f2d4ac9b000]
252c280
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
267c295
< "http-bio-8080-exec-9" #29 daemon prio=5 os_prio=0 tid=0x00007fb9f860d000 nid=0x313a waiting on condition [0x00007fb9d8ec5000]
---
> "http-bio-8080-exec-9" #29 daemon prio=5 os_prio=0 tid=0x00007f2da85af000 nid=0x3287 waiting on condition [0x00007f2d4ad9c000]
270c298
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
285c313
< "http-bio-8080-exec-8" #28 daemon prio=5 os_prio=0 tid=0x00007fb9f860b800 nid=0x3139 waiting on condition [0x00007fb9d8fc6000]
---
> "http-bio-8080-exec-8" #28 daemon prio=5 os_prio=0 tid=0x00007f2da85ad000 nid=0x3286 waiting on condition [0x00007f2d4ae9d000]
288c316
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
303,316c331,341
< "http-bio-8080-exec-7" #27 daemon prio=5 os_prio=0 tid=0x00007fb9f8609800 nid=0x3138 runnable [0x00007fb9d90c7000]
< java.lang.Thread.State: RUNNABLE
< at java.net.SocketInputStream.socketRead0(Native Method)
< at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
< at java.net.SocketInputStream.read(SocketInputStream.java:171)
< at java.net.SocketInputStream.read(SocketInputStream.java:141)
< at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:534)
< at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:519)
< at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:174)
< at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1048)
< at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
< at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:317)
< - locked <0x00000000d8b39638> (a org.apache.tomcat.util.net.SocketWrapper)
< at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
---
> "http-bio-8080-exec-7" #27 daemon prio=5 os_prio=0 tid=0x00007f2da85ab800 nid=0x3285 waiting on condition [0x00007f2d4af9e000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
> at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
322c347
< - <0x00000000874399e8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
---
> - None
324c349
< "http-bio-8080-exec-6" #26 daemon prio=5 os_prio=0 tid=0x00007fb9f8608000 nid=0x3137 waiting on condition [0x00007fb9d91c8000]
---
> "http-bio-8080-exec-6" #26 daemon prio=5 os_prio=0 tid=0x00007f2da85a9800 nid=0x3284 waiting on condition [0x00007f2d4b09f000]
327c352
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
342,355c367,377
< "http-bio-8080-exec-5" #25 daemon prio=5 os_prio=0 tid=0x00007fb9f8606000 nid=0x3136 runnable [0x00007fb9d92c9000]
< java.lang.Thread.State: RUNNABLE
< at java.net.SocketInputStream.socketRead0(Native Method)
< at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
< at java.net.SocketInputStream.read(SocketInputStream.java:171)
< at java.net.SocketInputStream.read(SocketInputStream.java:141)
< at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:534)
< at org.apache.coyote.http11.InternalInputBuffer.fill(InternalInputBuffer.java:519)
< at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:174)
< at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1048)
< at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
< at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:319)
< - locked <0x00000000d8b39360> (a org.apache.tomcat.util.net.SocketWrapper)
< at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
---
> "http-bio-8080-exec-5" #25 daemon prio=5 os_prio=0 tid=0x00007f2da85a8000 nid=0x3283 waiting on condition [0x00007f2d4b1a0000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
> at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
361c383
< - <0x0000000087425448> (a java.util.concurrent.ThreadPoolExecutor$Worker)
---
> - None
363c385
< "http-bio-8080-exec-4" #24 daemon prio=5 os_prio=0 tid=0x00007fb9f8604800 nid=0x3135 waiting on condition [0x00007fb9d93ca000]
---
> "http-bio-8080-exec-4" #24 daemon prio=5 os_prio=0 tid=0x00007f2da85a6800 nid=0x3282 waiting on condition [0x00007f2d4b2a1000]
366c388
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
381c403
< "http-bio-8080-exec-3" #23 daemon prio=5 os_prio=0 tid=0x00007fb9f8603000 nid=0x3134 waiting on condition [0x00007fb9d94cb000]
---
> "http-bio-8080-exec-3" #23 daemon prio=5 os_prio=0 tid=0x00007f2da85a4800 nid=0x3281 waiting on condition [0x00007f2d4b3a2000]
384c406
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
399c421
< "http-bio-8080-exec-2" #22 daemon prio=5 os_prio=0 tid=0x00007fb9f8601000 nid=0x3133 waiting on condition [0x00007fb9d95cc000]
---
> "http-bio-8080-exec-2" #22 daemon prio=5 os_prio=0 tid=0x00007f2da85a3000 nid=0x3280 waiting on condition [0x00007f2d4b4a3000]
402c424
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
417c439
< "http-bio-8080-exec-1" #21 daemon prio=5 os_prio=0 tid=0x00007fb9f85ff800 nid=0x3131 waiting on condition [0x00007fb9d96cd000]
---
> "http-bio-8080-exec-1" #21 daemon prio=5 os_prio=0 tid=0x00007f2da85a1000 nid=0x327f waiting on condition [0x00007f2d4b5a4000]
420c442
< - parking to wait for <0x0000000087424960> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x000000008749c318> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
435c457
< "ContainerBackgroundProcessor[StandardEngine[Catalina]]" #20 daemon prio=5 os_prio=0 tid=0x00007fb9f85fc800 nid=0x3130 waiting on condition [0x00007fb9d97ce000]
---
> "ContainerBackgroundProcessor[StandardEngine[Catalina]]" #20 daemon prio=5 os_prio=0 tid=0x00007f2da859e800 nid=0x327e waiting on condition [0x00007f2d4b6a5000]
444c466
< "GC Daemon" #18 daemon prio=2 os_prio=0 tid=0x00007fb9f856c800 nid=0x312e in Object.wait() [0x00007fb9da026000]
---
> "GC Daemon" #18 daemon prio=2 os_prio=0 tid=0x00007f2da850e800 nid=0x327b in Object.wait() [0x00007f2d4bdfc000]
447c469
< - waiting on <0x000000008772d768> (a sun.misc.GC$LatencyLock)
---
> - waiting on <0x0000000087674968> (a sun.misc.GC$LatencyLock)
449c471
< - locked <0x000000008772d768> (a sun.misc.GC$LatencyLock)
---
> - locked <0x0000000087674968> (a sun.misc.GC$LatencyLock)
454,477c476
< "RMI TCP Connection(2)-127.0.0.1" #16 daemon prio=5 os_prio=0 tid=0x00007fb9a8001800 nid=0x312b runnable [0x00007fb9da126000]
< java.lang.Thread.State: RUNNABLE
< at java.net.SocketInputStream.socketRead0(Native Method)
< at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
< at java.net.SocketInputStream.read(SocketInputStream.java:171)
< at java.net.SocketInputStream.read(SocketInputStream.java:141)
< at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
< at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
< - locked <0x000000008772f7c0> (a java.io.BufferedInputStream)
< at java.io.FilterInputStream.read(FilterInputStream.java:83)
< at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$5/2020518512.run(Unknown Source)
< at java.security.AccessController.doPrivileged(Native Method)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
< at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
< at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
< at java.lang.Thread.run(Thread.java:748)
<
< Locked ownable synchronizers:
< - <0x00000000874c64f0> (a java.util.concurrent.ThreadPoolExecutor$Worker)
<
< "RMI Scheduler(0)" #15 daemon prio=5 os_prio=0 tid=0x00007fb99c009800 nid=0x3128 waiting on condition [0x00007fb9da228000]
---
> "RMI Scheduler(0)" #15 daemon prio=5 os_prio=0 tid=0x00007f2d50005800 nid=0x3276 waiting on condition [0x00007f2d641c6000]
480c479
< - parking to wait for <0x0000000087404dd8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
---
> - parking to wait for <0x0000000087478e98> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
493,516c492
< "RMI TCP Connection(1)-127.0.0.1" #14 daemon prio=5 os_prio=0 tid=0x00007fb9a0001800 nid=0x3125 runnable [0x00007fb9da528000]
< java.lang.Thread.State: RUNNABLE
< at java.net.SocketInputStream.socketRead0(Native Method)
< at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
< at java.net.SocketInputStream.read(SocketInputStream.java:171)
< at java.net.SocketInputStream.read(SocketInputStream.java:141)
< at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
< at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
< - locked <0x0000000086f81cb0> (a java.io.BufferedInputStream)
< at java.io.FilterInputStream.read(FilterInputStream.java:83)
< at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$5/2020518512.run(Unknown Source)
< at java.security.AccessController.doPrivileged(Native Method)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
< at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
< at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
< at java.lang.Thread.run(Thread.java:748)
<
< Locked ownable synchronizers:
< - <0x00000000874c6690> (a java.util.concurrent.ThreadPoolExecutor$Worker)
<
< "RMI TCP Accept-0" #13 daemon prio=5 os_prio=0 tid=0x00007fb9f82c0800 nid=0x3121 runnable [0x00007fb9da92b000]
---
> "RMI TCP Accept-0" #13 daemon prio=5 os_prio=0 tid=0x00007f2da825e000 nid=0x326f runnable [0x00007f2d648c9000]
530c506
< "RMI TCP Accept-1099" #12 daemon prio=5 os_prio=0 tid=0x00007fb9f828d000 nid=0x3120 runnable [0x00007fb9daa2c000]
---
> "RMI TCP Accept-1099" #12 daemon prio=5 os_prio=0 tid=0x00007f2da822a800 nid=0x326e runnable [0x00007f2d649ca000]
543c519
< "RMI TCP Accept-0" #11 daemon prio=5 os_prio=0 tid=0x00007fb9f827a000 nid=0x311f runnable [0x00007fb9dab2d000]
---
> "RMI TCP Accept-0" #11 daemon prio=5 os_prio=0 tid=0x00007f2da8219800 nid=0x326d runnable [0x00007f2d8816c000]
556c532
< "Service Thread" #8 daemon prio=9 os_prio=0 tid=0x00007fb9f80c2800 nid=0x311e runnable [0x0000000000000000]
---
> "Service Thread" #8 daemon prio=9 os_prio=0 tid=0x00007f2da80c2800 nid=0x326c runnable [0x0000000000000000]
562c538
< "C1 CompilerThread2" #7 daemon prio=9 os_prio=0 tid=0x00007fb9f80bf800 nid=0x311d waiting on condition [0x0000000000000000]
---
> "C1 CompilerThread2" #7 daemon prio=9 os_prio=0 tid=0x00007f2da80bf800 nid=0x326b waiting on condition [0x0000000000000000]
568c544
< "C2 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007fb9f80bd800 nid=0x311b waiting on condition [0x0000000000000000]
---
> "C2 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f2da80bd800 nid=0x326a waiting on condition [0x0000000000000000]
574c550
< "C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007fb9f80bb000 nid=0x311a waiting on condition [0x0000000000000000]
---
> "C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f2da80bb000 nid=0x3269 waiting on condition [0x0000000000000000]
580c556
< "Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007fb9f80b9800 nid=0x3119 runnable [0x0000000000000000]
---
> "Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f2da80b9800 nid=0x3268 runnable [0x0000000000000000]
586c562
< "Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007fb9f8086800 nid=0x3113 in Object.wait() [0x00007fb9dbbfa000]
---
> "Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f2da8086800 nid=0x3267 in Object.wait() [0x00007f2d988f7000]
589c565
< - waiting on <0x00000000873908d0> (a java.lang.ref.ReferenceQueue$Lock)
---
> - waiting on <0x00000000876d91a8> (a java.lang.ref.ReferenceQueue$Lock)
591c567
< - locked <0x00000000873908d0> (a java.lang.ref.ReferenceQueue$Lock)
---
> - locked <0x00000000876d91a8> (a java.lang.ref.ReferenceQueue$Lock)
598c574
< "Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007fb9f8084000 nid=0x3112 in Object.wait() [0x00007fb9dbcfb000]
---
> "Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f2da8084000 nid=0x3266 in Object.wait() [0x00007f2d989f8000]
601c577
< - waiting on <0x0000000086f82f28> (a java.lang.ref.Reference$Lock)
---
> - waiting on <0x00000000876d91d8> (a java.lang.ref.Reference$Lock)
604c580
< - locked <0x0000000086f82f28> (a java.lang.ref.Reference$Lock)
---
> - locked <0x00000000876d91d8> (a java.lang.ref.Reference$Lock)
610c586
< "main" #1 prio=5 os_prio=0 tid=0x00007fb9f800c000 nid=0x3105 runnable [0x00007fba008c8000]
---
> "main" #1 prio=5 os_prio=0 tid=0x00007f2da800c000 nid=0x325a runnable [0x00007f2db177c000]
629c605
< "VM Thread" os_prio=0 tid=0x00007fb9f807a800 nid=0x3111 runnable
---
> "VM Thread" os_prio=0 tid=0x00007f2da807a800 nid=0x3265 runnable
631c607
< "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fb9f8022000 nid=0x310a runnable
---
> "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f2da8022000 nid=0x325b runnable
633c609
< "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fb9f8024000 nid=0x310c runnable
---
> "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f2da8024000 nid=0x325f runnable
635c611
< "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007fb9f8025800 nid=0x310d runnable
---
> "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f2da8025800 nid=0x3260 runnable
637c613
< "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007fb9f8027800 nid=0x310e runnable
---
> "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f2da8027800 nid=0x3261 runnable
639c615
< "VM Periodic Task Thread" os_prio=0 tid=0x00007fb9f82c3000 nid=0x3122 waiting on condition
---
> "VM Periodic Task Thread" os_prio=0 tid=0x00007f2da8260800 nid=0x3270 waiting on condition
发现http请求后运行的线程都是作为守护线程存在的,非守护线程只有tomcat的main线程
实验二:在http请求后开启一个线程池,然后运行提交三个马上就能结束的线程
@WebServlet("/HelloWorld2")
public class HelloWorld2 extends HttpServlet {
private String message;
@Override
public void init() throws ServletException {
message = "Hello world, this message is from servlet!";
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应内容类型
resp.setContentType("text/html");
//设置逻辑实现
PrintWriter out = resp.getWriter();
out.println("<h1>" + message + "</h1>");
class myThread1 implements Runnable{
@Override
public void run() {
Thread.currentThread().setName("print 1");
System.out.println("1");
}
};
class myThread2 implements Runnable{
@Override
public void run() {
Thread.currentThread().setName("print 2");
System.out.println("2");
}
};
class myThread3 implements Runnable{
@Override
public void run() {
Thread.currentThread().setName("print 3");
System.out.println("3");
}
};
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 1; i++) {
executorService.submit(new myThread1());
executorService.submit(new myThread2());
executorService.submit(new myThread3());
}
// executorService.shutdown();
}
}
1c1
< 2019-06-21 15:49:50
---
> 2019-06-21 15:51:40
3a4,78
> "print95" #56 prio=5 os_prio=0 tid=0x00007f8928008000 nid=0x4752 waiting on condition [0x00007f892ebf2000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "print98" #55 prio=5 os_prio=0 tid=0x00007f8928006800 nid=0x4751 waiting on condition [0x00007f892ecf3000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "print97" #54 prio=5 os_prio=0 tid=0x00007f8928004800 nid=0x4750 waiting on condition [0x00007f892edf4000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "print96" #53 prio=5 os_prio=0 tid=0x00007f8928003000 nid=0x474f waiting on condition [0x00007f892eef5000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
> "print99" #52 prio=5 os_prio=0 tid=0x00007f8928002000 nid=0x474e waiting on condition [0x00007f892f7f6000]
> java.lang.Thread.State: WAITING (parking)
> at sun.misc.Unsafe.park(Native Method)
> - parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
> at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
> at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
> at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
> at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748)
>
> Locked ownable synchronizers:
> - None
>
423,445d497
< "RMI TCP Connection(2)-127.0.0.1" #17 daemon prio=5 os_prio=0 tid=0x00007f8970001800 nid=0x4667 runnable [0x00007f899c70f000]
< java.lang.Thread.State: RUNNABLE
< at java.net.SocketInputStream.socketRead0(Native Method)
< at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
< at java.net.SocketInputStream.read(SocketInputStream.java:171)
< at java.net.SocketInputStream.read(SocketInputStream.java:141)
< at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
< at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
< - locked <0x000000008755f950> (a java.io.BufferedInputStream)
< at java.io.FilterInputStream.read(FilterInputStream.java:83)
< at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$5/989383833.run(Unknown Source)
< at java.security.AccessController.doPrivileged(Native Method)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
< at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
< at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
< at java.lang.Thread.run(Thread.java:748)
<
< Locked ownable synchronizers:
< - <0x00000000874d3418> (a java.util.concurrent.ThreadPoolExecutor$Worker)
<
461,483d512
<
< "RMI TCP Connection(1)-127.0.0.1" #15 daemon prio=5 os_prio=0 tid=0x00007f8968001800 nid=0x4663 runnable [0x00007f899cd89000]
< java.lang.Thread.State: RUNNABLE
< at java.net.SocketInputStream.socketRead0(Native Method)
< at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
< at java.net.SocketInputStream.read(SocketInputStream.java:171)
< at java.net.SocketInputStream.read(SocketInputStream.java:141)
< at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
< at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
< - locked <0x00000000875ba8a0> (a java.io.BufferedInputStream)
< at java.io.FilterInputStream.read(FilterInputStream.java:83)
< at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:555)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$5/989383833.run(Unknown Source)
< at java.security.AccessController.doPrivileged(Native Method)
< at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
< at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
< at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
< at java.lang.Thread.run(Thread.java:748)
<
< Locked ownable synchronizers:
< - <0x00000000874d35b8> (a java.util.concurrent.ThreadPoolExecutor$Worker)
当运行shutdown后,日志如下:
2019-06-21 15:52:53
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode):
"DestroyJavaVM" #59 prio=5 os_prio=0 tid=0x00007f89c05b6800 nid=0x4645 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"print95" #56 prio=5 os_prio=0 tid=0x00007f8928008000 nid=0x4752 waiting on condition [0x00007f892ebf2000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"print98" #55 prio=5 os_prio=0 tid=0x00007f8928006800 nid=0x4751 waiting on condition [0x00007f892ecf3000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"print97" #54 prio=5 os_prio=0 tid=0x00007f8928004800 nid=0x4750 waiting on condition [0x00007f892edf4000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"print96" #53 prio=5 os_prio=0 tid=0x00007f8928003000 nid=0x474f waiting on condition [0x00007f892eef5000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"print99" #52 prio=5 os_prio=0 tid=0x00007f8928002000 nid=0x474e waiting on condition [0x00007f892f7f6000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000d97cbd18> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"Attach Listener" #51 daemon prio=9 os_prio=0 tid=0x00007f898c001000 nid=0x472f waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"RMI Scheduler(0)" #16 daemon prio=5 os_prio=0 tid=0x00007f8958007800 nid=0x4665 waiting on condition [0x00007f899cc84000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000873f86e8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"GC Daemon" #14 daemon prio=2 os_prio=0 tid=0x00007f89c0502000 nid=0x4662 in Object.wait() [0x00007f899ce8b000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000875bcd28> (a sun.misc.GC$LatencyLock)
at sun.misc.GC$Daemon.run(GC.java:117)
- locked <0x00000000875bcd28> (a sun.misc.GC$LatencyLock)
Locked ownable synchronizers:
- None
"RMI TCP Accept-0" #13 daemon prio=5 os_prio=0 tid=0x00007f89c0270000 nid=0x465c runnable [0x00007f899d4dd000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:52)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:405)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:377)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"RMI TCP Accept-1099" #12 daemon prio=5 os_prio=0 tid=0x00007f89c023c800 nid=0x465b runnable [0x00007f899d5de000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:405)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:377)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"RMI TCP Accept-0" #11 daemon prio=5 os_prio=0 tid=0x00007f89c0229800 nid=0x465a runnable [0x00007f899d6df000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
at java.net.ServerSocket.implAccept(ServerSocket.java:545)
at java.net.ServerSocket.accept(ServerSocket.java:513)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:405)
at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:377)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"Service Thread" #8 daemon prio=9 os_prio=0 tid=0x00007f89c00c2800 nid=0x4659 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C1 CompilerThread2" #7 daemon prio=9 os_prio=0 tid=0x00007f89c00bf800 nid=0x4658 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f89c00bd800 nid=0x4657 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f89c00bb000 nid=0x4656 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" #4 daemon prio=9 os_prio=0 tid=0x00007f89c00b9800 nid=0x4655 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" #3 daemon prio=8 os_prio=0 tid=0x00007f89c0086800 nid=0x464e in Object.wait() [0x00007f899e7ac000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000875bd878> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
- locked <0x00000000875bd878> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=0 tid=0x00007f89c0084000 nid=0x464d in Object.wait() [0x00007f899e8ad000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000875bd8a8> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000000875bd8a8> (a java.lang.ref.Reference$Lock)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Locked ownable synchronizers:
- None
"VM Thread" os_prio=0 tid=0x00007f89c007a800 nid=0x464c runnable
"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f89c0022000 nid=0x4647 runnable
"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f89c0024000 nid=0x4648 runnable
"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f89c0025800 nid=0x4649 runnable
"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f89c0027800 nid=0x464a runnable
"VM Periodic Task Thread" os_prio=0 tid=0x00007f89c0272800 nid=0x465d waiting on condition
JNI global references: 236
结论:
最后可以总结一下,不是tomcat的问题,而是线程池的问题
通过自定义线程池创建的线程并不是守护线程,因此如果还有线程在运行,那么运行shutdown就不会停止tomcat进程。