调用shutdown脚本关闭tomcat时,某些进程关闭不掉(二)

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

运行shutdowm.sh

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进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值