Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程) spa
用戶線程即運行在前臺的線程,而守護線程是運行在後臺的線程。 守護線程做用是爲其餘前臺線程的運行提供便利服務,並且僅在普通、非守護線程仍然運行時才須要,好比垃圾回收線程就是一個守護線程。當VM檢測僅剩一個守護線程,而用戶線程都已經退出運行時,VM就會退出,由於沒有若是沒有了被守護者,也就沒有繼續運行程序的必要了。若是有非守護線程仍然存活,VM就不會退出。.net
守護線程並不是只有虛擬機內部提供,用戶在編寫程序時也能夠本身設置守護線程。用戶能夠用Thread的setDaemon(true)方法設置當前線程爲守護線程。線程
雖然守護線程可能很是有用,但必須當心確保其餘全部非守護線程消亡時,不會因爲它的終止而產生任何危害。由於你不可能知道在全部的用戶線程退出運行前,守護線程是否已經完成了預期的服務任務。一旦全部的用戶線程退出了,虛擬機也就退出運行了。 所以,不要在守護線程中執行業務邏輯操做(好比對數據的讀寫等)。、code
另外有幾點須要注意:對象
一、setDaemon(true)必須在調用線程的start()方法以前設置,不然會跑出IllegalThreadStateException異常。blog
二、在守護線程中產生的新線程也是守護線程。
三、 不要認爲全部的應用均可以分配給守護線程來進行服務,好比讀寫操做或者計算邏輯。 get
線程能夠阻塞於四種狀態:虛擬機
一、當線程執行Thread.sleep()時,它一直阻塞到指定的毫秒時間以後,或者阻塞被另外一個線程打斷;it
二、當線程碰到一條wait()語句時,它會一直阻塞到接到通知(notify())、被中斷或通過了指定毫秒時間爲止(若制定了超時值的話)io
三、線程阻塞與不一樣I/O的方式有多種。常見的一種方式是InputStream的read()方法,該方法一直阻塞到從流中讀取一個字節的數據爲止,它能夠無限阻塞,所以不能指定超時時間;
四、線程也能夠阻塞等待獲取某個對象鎖的排他性訪問權限(即等待得到synchronized語句必須的鎖時阻塞)。
注意,並不是全部的阻塞狀態都是可中斷的,以上阻塞狀態的前兩種能夠被中斷,後兩種不會對中斷作出反應