執行緒的幾個狀態,及若干名詞解釋

weixin_33766168發表於2017-11-06

1、新建狀態(New):新建立了一個執行緒物件。

2、就緒狀態(Runnable):執行緒物件建立後,其他執行緒呼叫了該物件的start()方法。該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取CPU的使用權。

3、執行狀態(Running):就緒狀態的執行緒獲取了CPU,執行程式程式碼。

4、阻塞狀態(Blocked):阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。

阻塞的情況分三種:

(一)、等待阻塞:執行的執行緒執行wait()方法,JVM會把該執行緒放入等待池中。

(二)、同步阻塞:執行的執行緒在獲取物件的同步鎖時,若該同步鎖被別的執行緒佔用,則JVM會把該執行緒放入鎖池中。

(三)、其他阻塞:執行的執行緒執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該執行緒置為阻塞狀態。當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

5、死亡狀態(Dead):執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

執行緒阻塞,可以這樣說,只要執行緒沒有被cpu執行,就可以稱為阻塞。有的阻塞可以自動恢復,有的則需要呼叫方法解除阻塞。

7、常見執行緒名詞解釋

主執行緒:JVM呼叫程式mian()所產生的執行緒。

當前執行緒:這個是容易混淆的概念。一般指通過Thread.currentThread()來獲取的程式。

後臺執行緒:指為其他執行緒提供服務的執行緒,也稱為守護執行緒。JVM的垃圾回收執行緒就是一個後臺執行緒。

前臺執行緒:是指接受後臺執行緒服務的執行緒,其實前臺後臺執行緒是聯絡在一起,就像傀儡和幕後操縱者一樣的關係。傀儡是前臺執行緒、幕後操縱者是後臺執行緒。由前臺執行緒建立的執行緒預設也是前臺執行緒。

可以通過isDaemon()和setDaemon()方法來判斷和設定一個執行緒是否為後臺執行緒。

14、同步方法和同步程式碼塊的區別是什麼?

在Java語言中,每一個物件有一把鎖。執行緒可以使用synchronized關鍵字來獲取物件上的鎖。synchronized關鍵字可應用在方法級別(粗粒度鎖)或者是程式碼塊級別(細粒度鎖)。

15.在監視器(Monitor)內部,是如何做執行緒同步的?程式應該做哪種級別的同步?

監視器和鎖在Java虛擬機器中是一塊使用的。監視器監視一塊同步程式碼塊,確保一次只有一個執行緒執行同步程式碼塊。每一個監視器都和一個物件引用相關聯。執行緒在獲取鎖之前不允許執行同步程式碼。

16.什麼是死鎖(deadlock)?

兩個程式都在等待對方執行完畢才能繼續往下執行的時候就發生了死鎖。結果就是兩個程式都陷入了無限的等待中。

17.如何確保N個執行緒可以訪問N個資源同時又不導致死鎖?

使用多執行緒的時候,一種非常簡單的避免死鎖的方式就是:指定獲取鎖的順序,並強制執行緒按照指定的順序獲取鎖。因此,如果所有的執行緒都是以同樣的順序加鎖和釋放鎖,就不會出現死鎖了。

相關文章