JAVA併發實現四(守護線程和線程阻塞)

守護線程

 

  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語句必須的鎖時阻塞)。

 

    注意,並不是全部的阻塞狀態都是可中斷的,以上阻塞狀態的前兩種能夠被中斷,後兩種不會對中斷作出反應

 

參考:http://blog.csdn.net/ns_code/article/details/17099981

相關文章
相關標籤/搜索