守护线程与普通线程
1 | public class DaemonThreadTest { |
demon-thread(守护线程),在jvm检测到没有前台(普通)线程运行时,就会自动终止守护线程;
(把daemon线程当做普通线程很危险,因为不知道什么时候就会终止掉了)
如果还有一个或以上的非守护线程则JVM不会退出(这也是有的web应用无法被shutdown的原因吧)
应用
GC垃圾回收器
gc线程就是一个daemon-thread,有其他线程运行时它是正常处理(回收内存垃圾);
当jvm终止前检查到没有普通线程运行时,就会自动终止gc线程。
web容器(tomcat)
tomcat启动时整个进程会使用socket阻塞在8005端口,参考
org.apache.catalina.core.StandardServer#await
;收到SHOWDOWN信号后停止主线程org.apache.catalina.startup.Catalina#stopServer
(Java中守护线程的总结)[https://blog.csdn.net/shimiso/article/details/8964414]