Java的高明之處就是在於不斷的總結實際應用中不斷出現的通用問題,爲此提供此類問題的底層實現,向調用者提供解決問題的接口實現,調用者大可沒必要徹底的明白底層的實現原理和實現過程,只要照葫蘆畫瓢,每每問題就能夠迎刃而解。可是對於一個專業人員來講,掌握這些暴漏的接口當然非常重要,學會使用的同時,還要知其然,知其因此然。java
線程也是java種引進的一個很重要的應用。爲此研究一下線程的一些知識,共你們參考。spa
線程的概念線程
程序中單獨順序的流控制,自己不能運行,只能用在程序中。orm
單線程的概念沒有什麼新的地方,真正有趣的是在一個程序中同時使用多個線程來完成不一樣的任務。某些地方用輕量進程 (Lightweight Process)來代替線程,線程與真正進程的類似性在於它們都是單一順序控制流。然而線程被認爲輕量是因爲 它運行於整個程序的上 下 文內,能使用整個程序共有的資源和程序環境。 對象
1. 程序經過Thread t = new Thread(),調用t.start()啓動一個線程,使該線程進入可運行(Runnable)的狀態。blog
2. 由JVM的決定去調度(Scheduler) 在可運行狀態(Runnable)下的線程,使該線程處於運行 (Running) 狀態,因爲JVM的調度會出現不可控性,即不是優先級高的先被調用,可能先調用,也可能後調用的的狀況。運行狀態(Running)下,調用禮讓yield()方法,可使線程回到可運行狀態(Runnable)下,再次JVM的調度(並不依賴優先級)。接口
3. 線程在Running的過程當中可能會遇到阻塞(Blocked)狀況生命週期
①.調用join()和sleep()方法,sleep()時間結束或被打斷,join()中斷,IO完成都會回到Runnable狀態,等待JVM的調度。進程
②.調用wait(),使該線程處於等待池(wait blocked pool),直到notify()/notifyAll(),線程被喚醒被放到鎖池(lock blocked pool ),釋放同步鎖使線程回到可運行狀態(Runnable)資源
③.對Running狀態的線程加同步鎖(Synchronized)使其進入(lock blocked pool ),同步鎖被釋放進入可運行狀態(Runnable)。
4. 線程run()運行結束或異常退出,線程到達死亡狀態(Dead)
sleep和wait的區別有:
1,類:這兩個方法來自不一樣的類分別是Thread和Object
2,鎖:最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其餘線程可使用同步控制塊或者方法。
3,域:wait,notify和notifyAll只能在同步控制方法或者同步控制塊裏面使用,而sleep能夠在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,異:sleep必須捕獲異常,而wait,notify和notifyAll不須要捕獲異常
5,停:其實二者均可以讓線程暫停一段時間,可是本質的區別是一個線程的運行狀態控制,一個是線程之間的通信的問題
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM肯定喚醒哪一個線程,並且不是按優先級。
notifyAll():喚醒全部處入等待狀態的線程,注意並非給全部喚醒線程一個對象的鎖,而是讓它們競爭