Java併發編程(4):守護線程與線程阻塞的四種狀況

 

 JAVA大數據中高級架構 2018-11-06 22:19sql

 

守護線程

Java中有兩類線程:User Thread(用戶線程)、Daemon Thread(守護線程)架構

用戶線程即運行在前臺的線程,而守護線程是運行在後臺的線程。 守護線程做用是爲其餘前臺線程的運行提供便利服務,並且僅在普通、非守護線程仍然運行時才須要,好比垃圾回收線程就是一個守護線程。當VM檢測僅剩一個守護線程,而用戶線程都已經退出運行時,VM就會退出,由於沒有若是沒有了被守護這,也就沒有繼續運行程序的必要了。若是有非守護線程仍然存活,VM就不會退出。併發

守護線程並不是只有虛擬機內部提供,用戶在編寫程序時也能夠本身設置守護線程。用戶能夠用Thread的setDaemon(true)方法設置當前線程爲守護線程。分佈式

雖然守護線程可能很是有用,但必須當心確保其餘全部非守護線程消亡時,不會因爲它的終止而產生任何危害。由於你不可能知道在全部的用戶線程退出運行前,守護線程是否已經完成了預期的服務任務。一旦全部的用戶線程退出了,虛擬機也就退出運行了。 所以,不要在守護線程中執行業務邏輯操做(好比對數據的讀寫等)。、高併發

另外有幾點須要注意:性能

一、setDaemon(true)必須在調用線程的start()方法以前設置,不然會跑出IllegalThreadStateException異常。學習

二、在守護線程中產生的新線程也是守護線程。大數據

三、 不要認爲全部的應用均可以分配給守護線程來進行服務,好比讀寫操做或者計算邏輯。spa

線程阻塞

線程能夠阻塞於四種狀態:線程

一、當線程執行Thread.sleep()時,它一直阻塞到指定的毫秒時間以後,或者阻塞被另外一個線程打斷;

二、當線程碰到一條wait()語句時,它會一直阻塞到接到通知(notify())、被中斷或通過了指定毫秒時間爲止(若制定了超時值的話)

三、線程阻塞與不一樣I/O的方式有多種。常見的一種方式是InputStream的read()方法,該方法一直阻塞到從流中讀取一個字節的數據爲止,它能夠無限阻塞,所以不能指定超時時間;

四、線程也能夠阻塞等待獲取某個對象鎖的排他性訪問權限(即等待得到synchronized語句必須的鎖時阻塞)。

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

歡迎工做一到五年的Java工程師朋友們加入Java架構開發 : 867748702 羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、 Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper, Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料) 合理利用本身每一分每一秒的時間來學習提高本身, 不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索