Java多執行緒總結筆記(二) 執行緒各狀態及轉換

2021-07-04 14:49:01 字數 1762 閱讀 4067

執行緒狀態型別

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()方法,該執行緒結束生命週期。

二.執行緒狀態之間的轉換

三 yield()

執行緒的讓步是通過thread.yield()來實現的。yield()方法的作用是:暫停當前正在執行的執行緒物件,並執行其他執行緒。 yield()應該做的是讓當前執行執行緒回到可執行狀態,以允許具有相同優先順序的其他執行緒獲得執行機會。因此,使用yield()的目的是讓相同優先順序的執行緒之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的執行緒還有可能被執行緒排程程式再次選中

四、join()

thread的非靜態方法join()讓乙個執行緒b「加入」到另外乙個執行緒a的尾部。在a執行完畢之前,b不能工作。例如:

thread t = new mythread();

t.start();

t.join();

另外,join()方法還有帶超時限制的過載版本。 例如t.join(5000);則讓執行緒等待5000毫秒,如果超過這個時間,則停止等待,變為可執行狀態。

注意:1、執行緒睡眠是幫助所有執行緒獲得執行機會的最好方法。

2、執行緒睡眠到期自動甦醒,並返回到可執行狀態,不是執行狀態。sleep()中指定的時間是執行緒不會執行的最短時間。因此,sleep()方法不能保證該執行緒睡眠到期後就開始執行。

3、sleep()是靜態方法,只能控制當前正在執行的執行緒。

4、當設計多執行緒應用程式的時候,一定不要依賴於執行緒的優先順序。因為執行緒排程優先順序操作是沒有保障的,只能把執行緒優先順序作用作為一種提高程式效率的方法,但是要保證程式不依賴這種操作。

除了以上三種方式(sleep, yield, join)外,還有下面幾種特殊情況可能使執行緒離開執行狀態:

1、執行緒的run()方法完成。

3、執行緒不能在物件上獲得鎖定,它正試圖執行該物件的方法**。

4、執行緒排程程式可以決定將當前執行狀態移動到可執行狀態,以便讓另乙個執行緒獲得執行機會,而不需要任何理由。

JAVA學習筆記 多執行緒(二)執行緒常用方法

thread類包含的方法 start 啟動執行緒 isalive 判斷執行緒當前是否正在執行 setpriority 設定優先順序 jion 使乙個執行緒等待另乙個執行緒結束 sleep mills long 指定執行緒休眠指定毫秒 yield 使執行緒暫停並允許執行其他程序 wait 和notif...

Java多執行緒系列(二) 執行緒安全

個人主頁 tuzhenyu s page 多執行緒併發操作下可能出現記憶體不可見問題,指令重排序問題,4位元組賦值問題等,主要造成執行緒不安全的還是記憶體不可見和指令重排序 非執行緒安全出現的情況主要是多執行緒同時對乙個共享可變變數進行讀寫操作,因此可以通過以下三種方法解決非執行緒安全問題 將可變變...

java多執行緒 二 執行緒的互斥

多執行緒相對於單執行緒而言,大大的提高了硬體cpu的使用率,提高了處理的速度。任何事物帶來的都是兩面性的,多執行緒為我們帶來效能提高的同時也帶來了許多的安全性問題。說互斥之前,先說一下什麼是互斥,舉個列子,一天去atm機取錢,如果沒有互斥的話,你正取著錢突然有個人衝進來把你的錢搶走了。這時候你想,要...