執行緒狀態 Day24

2021-09-29 20:33:39 字數 2958 閱讀 7941

執行緒狀態概述:

timed waiting在api中的描述為:乙個正在限時等待另乙個執行緒執行乙個(喚醒)動作的執行緒處於這一狀態

在我們寫賣票的案例中,為了減少執行緒執行太快,現象不明顯等問題,我們在run方法中新增了sleep語句,這樣就 強制當前正在執行的執行緒休眠(暫停執行),以「減慢執行緒」。其實當我們呼叫了sleep方法之後,當前執行的執行緒就進入到「休眠狀態」,其實就是所謂的timed waiting(計時等 待),那麼我們通過乙個案例加深對該狀態的乙個理解。

1

package demosummary.threadstate;23

/** 4 * 實現乙個計數器,計數到100,在每個數字之間暫停1秒,每隔10個數字輸出乙個字串

5 */

6public

class

threadstate

extends

thread

13 system.out.

println

(i);

14try

catch

(interruptedexception e)19}

20}2122

public

static

void

main

(string[

] args)

25}

通過案例可以發現,sleep方法的使用還是很簡單的。我們需要記住下面幾點:

1. 進入 timed_waiting 狀態的一種常見情形是呼叫的 sleep 方法,單獨的執行緒也可以呼叫,不一定非要有協 作關係。

2. 為了讓其他執行緒有機會執行,可以將thread.sleep()的呼叫放執行緒run()之內。這樣才能保證該執行緒執行過程 中會睡眠

3. sleep與鎖無關,執行緒睡眠到期自動甦醒,並返回到runnable(可執行)狀態。

tip:sleep()中指定的時間是執行緒不會執行的最短時間。因此,sleep()方法不能保證該執行緒睡眠到期後就開始立刻執行

timed waiting執行緒狀態圖

blocked(鎖阻塞)

blocked狀態在api中的介紹為:乙個正在阻塞等待乙個監視器鎖(鎖物件)的執行緒處於這一狀態,比如,執行緒a與執行緒b**中使用同一鎖,如果執行緒a獲 取到鎖,執行緒a進入到runnable狀態,那麼執行緒b就進入到blocked鎖阻塞狀態。

blocked執行緒狀態圖

waiting(無限等待)

wating狀態在api中介紹為:乙個正在無限期等待另乙個執行緒執行乙個特別的(喚醒)動作的執行緒處於這一狀態

1

package demosummary.threadstate;23

public

class

threadwaiting

catch

(interruptedexception e)

20 system.out.

println

(thread.

currentthread()

.getname()

+"---從waiting狀態醒來,繼續執行");

21}22}

23}24}

,"等待執行緒").

start()

;25newthread

(new

runnable()

catch

(interruptedexception e)

3536

synchronized

(obj)40}

41}42}

,"等待執行緒").

start()

;43}44

}

通過上述案例我們會發現,乙個呼叫了某個物件的 object.wait 方法的執行緒會等待另乙個執行緒呼叫此物件的 object.notify()方法 或 object.notifyall()方法。其實waiting狀態並不是乙個執行緒的操作,它體現的是多個執行緒間的通訊,可以理解為多個執行緒之間的協作關係, 多個執行緒會爭取鎖,同時相互之間又存在協作關係。就好比在公司裡你和你的同事們,你們可能存在晉公升時的競 爭,但更多時候你們更多是一起合作以完成某些任務。

當多個執行緒協作時,比如a,b執行緒,如果a執行緒在runnable(可執行)狀態中呼叫了wait()方法那麼a執行緒就進入 了waiting(無限等待)狀態,同時失去了同步鎖。假如這個時候b執行緒獲取到了同步鎖,在執行狀態中呼叫了 notify()方法,那麼就會將無限等待的a執行緒喚醒。注意是喚醒,如果獲取到鎖物件,那麼a執行緒喚醒後就進入 runnable(可執行)狀態;如果沒有獲取鎖物件,那麼就進入到blocked(鎖阻塞狀態)

我們在翻閱api的時候會發現timed waiting(計時等待) 與 waiting(無限等待) 狀態聯絡還是很緊密的, 比如waiting(無限等待) 狀態中wait方法是空參的,而timed waiting(計時等待) 中wait方法是帶參的。 這種帶參的方法,其實是一種倒計時操作,相當於我們生活中的小鬧鐘,我們設定好時間,到時通知,可是 如果提前得到(喚醒)通知,那麼設定好時間在通知也就顯得多此一舉了,那麼這種設計方案其實是一舉兩 得。如果沒有得到(喚醒)通知,那麼執行緒就處於timed waiting狀態,直到倒計時完畢自動醒來;如果在倒 計時期間得到(喚醒)通知,那麼執行緒從timed waiting狀態立刻喚醒。

day24 學習總結

構造方法 date d new date string類和date類的轉換,通過dateformat類來實現轉換 dateformat為抽象類,需要通過其具體的子類來建立物件 dateformat類 構造方法 public dateformat 無參構造 public dateformat stri...

每日演算法 day 24

那些你早出晚歸付出的刻苦努力,你不想訓練,當你覺的太累了但還是要咬牙堅持的時候,那就是在追逐夢想,不要在意終點有什麼,要享受路途的過程,或許你不能成就夢想,但一定會有更偉大的事情隨之而來。mamba out 2020.3.9 假設資料 tank 5 n 3 v 3 4 2 n v123 4510 1...

day24總結 多執行緒和設計模式

jdk5以後的針對執行緒的鎖定操作和釋放操作 定義鎖物件 private lock lock new reentrantlock 加鎖 lock.lock 釋放鎖 lock.unlock 死鎖問題的描述和 體現 死鎖 兩個或兩個以上的執行緒在爭奪資源的過程中,發生的一種相互等待的現象。public ...