http://www.cnblogs.com/super-d2/p/3348183.html 在Java中有兩類線程:User Thread(使用者線程)、Daemon Thread(守護線程)
Daemon的作用是為其他線程的運行提供服務,比如說GC線程。其實User Thread線程和Daemon Thread守護線程本質上來說去沒啥區別的,唯一的區別之處就在虛擬機器的離開:如果User Thread全部撤離,那麼Daemon Thread也就沒啥線程好服務的了,所以虛擬機器也就退出了。 守護線程並非虛擬機器內部可以提供,使用者也可以自行的設定守護線程,方法:public final void setDaemon(boolean on) ;但是有幾點需要注意: thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在啟動並執行常規線程設定為守護線程。 (備忘:這點與守護進程有著明顯的區別,守護進程是建立後,讓進程擺脫原會話的控制+讓進程擺脫原進程組的控制+讓進程擺脫原控制終端的控制;所以說寄託於虛擬機器的語言機制跟系統級語言有著本質上面的區別) 在Daemon線程中產生的新線程也是Daemon的。 (這一點又是有著本質的區別了:守護進程fork()出來的子進程不再是守護進程,儘管它把父進程的進程相關資訊複製過去了,但是子進程的進程的父進程不是init進程,所謂的守護進程本質上說就是“父進程掛掉,init收養,然後檔案0,1,2都是/dev/null,目前的目錄到/”) 不是所有的應用都可以分配給Daemon線程來進行服務,比如讀寫操作或者計算邏輯。因為在Daemon Thread還沒來的及進行操作時,虛擬機器可能已經退出了。 JRE判斷程式是否執行結束的標準是所有的前台執線程行完畢了,而不管後台線程的狀態,因此,在使用後台線程候一定要注意這個問題。
但是daemon Thread實際應用在那裡呢。舉個例子,web伺服器中的Servlet,容器啟動時後台初始化一個服務線程,即調度線程,負責處理http請求,然後每個請求過來調度線程從線程池中取出一個工作者線程來處理該請求,從而實現並發控制的目的。