最近遇到一個奇怪的問題,tomcat忽然沒法正常shutdown了,明明前幾天都一切正常,還覺得是jenkins出了什麼問題,後面發現手動shutdown失敗。最後才發現是引入了Quatz形成的,其根本緣由在於守護進程Daemon Thread。備忘下:html
在Java中有兩類線程:用戶線程 (User Thread)、守護線程 (Daemon Thread)。spring
所謂守護 線程,是指在程序運行的時候在後臺提供一種通用服務的線程,好比垃圾回收線程就是一個很稱職的守護者,而且這種線程並不屬於程序中不可或缺的部分。因 此,當全部的非守護線程結束時,程序也就終止了,同時會殺死進程中的全部守護線程。反過來講,只要任何非守護線程還在運行,程序就不會終止。數據庫
用戶線程和守護線程二者幾乎沒有區別,惟一的不一樣之處就在於虛擬機的離開:若是用戶線程已經所有退出運行了,只剩下守護線程存在了,虛擬機也就退出了。 由於沒有了被守護者,守護線程也就沒有工做可作了,也就沒有繼續運行程序的必要了。tomcat
將線程轉換爲守護線程能夠經過調用Thread對象的setDaemon(true)方法來實現。在使用守護線程時須要注意一下幾點:url
(1) thread.setDaemon(true)必須在thread.start()以前設置,不然會跑出一個IllegalThreadStateException異常。你不能把正在運行的常規線程設置爲守護線程。 .net
(2) 在Daemon線程中產生的新線程也是Daemon的。線程
(3) 守護線程應該永遠不去訪問固有資源,如文件、數據庫,由於它會在任什麼時候候甚至在一個操做的中間發生中斷。htm
http://www.cnblogs.com/luochengor/archive/2011/08/11/2134818.html對象
把quartz設置成守護進程:blog
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.makeSchedulerThreadDaemon">true</prop>
<prop key="org.quartz.threadPool.makeThreadsDaemons">true</prop>
</props>
</property>
以上配置放在了class="org.springframework.scheduling.quartz.SchedulerFactoryBean" 的bean配置項中。