1.Java多線程的6種狀態

1. New(新建)

    當用new操作符創建一個新線程時,如 new Thread(r), 該線程還沒有開始運行。這意味着它的狀態是new,未調用start方法。

2. Runnable(可運行)

   一旦調用start()方法,線程就處於runnable狀態。可以可運行的線程可能正在運行也可能沒有運行,這取決於操作系統給線程提供運行的時間(線程獲取cpu的執行權限,所以這個狀態其實代表了2種狀態,runnable和running狀態)

   事實上,運行中的線程被中斷,目的是爲了讓他們線程獲得運行機會。線程調度的細節依賴於操作系統提供的服務。搶佔式調度系統給每一個可運行線程一個時間片來執行任務。當時間片用完,操作系統剝奪該線程的運行權,並給另一個線程可運行機會。當選擇下一個線程時,操作系統考慮線程的優先級。

yield()的作用是讓步。它能讓當前線程由“運行狀態”進入到“就緒狀態Runnable”,從而讓其它具有相同優先級的等待線程獲取執行權;但是,並不能保證在當前線程調用yield()之後,其它具有相同優先級的線程就一定能獲得執行權;也有可能是當前線程又進入到“運行狀態”繼續運行!

3. Blocked(被阻塞)

當一個線程試圖獲取一個內部的對象鎖synchronized(而不是java.util.concurrent庫裏的鎖), 而該鎖被其他線程持有,則該線程進入阻塞狀態。當其他線程釋放該鎖,並且線程調度器允許本線程持有它的時候,該線程將變成非阻塞狀態。

4. Waiting(等待)

當線程通知另一個線程通知調度器一個條件時,它自己進入等待狀態。在調用Object.wait方法或Thread.join方法,或者是等待java.util.concurrent庫中的Lock或Condition時,就會出現這種情況。實際上,被阻塞狀態與被等待狀態是有很大不同的。

5.Timed Waiting(計時等待)

有幾個方法有一個超時參數。調用它們導致線程進入計時等待(timed waiting)狀態。這一狀態將一直保持到超時期滿或者接收到適當的通知。帶有超時參數的方法有Thread.sleep和Object.wait, Thrad.join, Lock.tryLock以及Condition.await的計時版。

6. Terminated(被終止)

   線程因如下兩個原因之一而被終止:

   1) 因爲run方法正常退出而自然死亡

   2) 因爲一個沒有捕獲的異常終止了run方法二意外死亡

wait/notify/notifyall/yield必須結合synchronized使用,Thread.join底層也是wait方法

注:以上案列經過本人測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章