1. 程式人生 > >java的守護執行緒與非守護執行緒(使用者執行緒)

java的守護執行緒與非守護執行緒(使用者執行緒)

Java的執行緒機制,在Java中有兩類執行緒:User Thread(使用者執行緒)、Daemon Thread(守護執行緒)

估計學過Unix開發但是沒有細緻學習Java的同學們會疑惑了,作業系統裡面是沒有所謂的守護執行緒的概念,只有守護程序一說,但是Java語言機制是構建在JVM的基礎之上的,意思是Java平臺把作業系統的底層給遮蔽起來,所以它可以在它自己的虛擬的平臺裡面構造出對自己有利的機制,而語言或者說平臺的設計者多多少少是收到Unix思想的影響,而守護執行緒機制又是對JVM這樣的平臺湊合,於是守護執行緒應運而生。

       Daemon的作用是為其他執行緒的執行提供服務,比如說GC執行緒。其實User Thread執行緒和Daemon Thread守護執行緒本質上來說去沒啥區別的,唯一的區別之處就在虛擬機器的離開:如果User Thread全部撤離,那麼Daemon Thread也就沒啥執行緒好服務的了,所以虛擬機器也就退出了,

簡單的講就是JVM的退出不用考慮守護執行緒的退出,而必須考慮使用者執行緒的退出。

       守護執行緒並非虛擬機器內部可以提供,使用者也可以自行的設定守護執行緒,方法:public final void setDaemon(boolean on) ;但是有幾點需要注意:

1)、thread.setDaemon(true)必須在thread.start()之前設定,否則會跑出一個IllegalThreadStateException異常。你不能把正在執行的常規執行緒設定為守護執行緒。  (備註:這點與守護程序有著明顯的區別,守護程序是建立後,讓程序擺脫原會話的控制+讓程序擺脫原程序組的控制+讓程序擺脫原控制終端的控制;所以說寄託於虛擬機器的語言機制跟系統級語言有著本質上面的區別)

2)、 在Daemon執行緒中產生的新執行緒也是Daemon的。  (這一點又是有著本質的區別了:守護程序fork()出來的子程序不再是守護程序,儘管它把父程序的程序相關資訊複製過去了,但是子程序的程序的父程序不是init程序,所謂的守護程序本質上說就是“父程序掛掉,init收養,然後檔案0,1,2都是/dev/null,當前目錄到/”)

3)、不是所有的應用都可以分配給Daemon執行緒來進行服務,比如讀寫操作或者計算邏輯。因為在Daemon Thread還沒來的及進行操作時,虛擬機器可能已經退出了。

  JRE判斷程式是否執行結束的標準是所有的前臺執執行緒行完畢了,而不管後臺執行緒的狀態,因此,在使用後臺執行緒候一定要注意這個問題。 

daemon Thread 實際應用:web伺服器中的Servlet

web伺服器中的Servlet,容器啟動時後臺初始化一個服務執行緒,即排程執行緒,負責處理http請求,然後每個請求過來排程執行緒從執行緒池中取出一個工作者執行緒來處理該請求,從而實現併發控制的目的。