執行緒等待與喚醒

2021-08-17 11:11:39 字數 2481 閱讀 3071

標籤: 多執行緒

所有的等待和喚醒執行緒,都是針對某個具體物件例項的.

api介面

說明wait()

讓當前執行緒進入等待(阻塞)狀態,直到其他執行緒呼叫此物件的notify()或notifyall()來喚醒,之後該執行緒進入就緒狀態.

wait(long timeout)

讓當前執行緒進入阻塞狀態,直到其他執行緒喚醒此執行緒或者超過指定時間,之後該執行緒進入就緒狀態

wait(long timeout,int nanos)

讓當前執行緒進入阻塞狀態,直到其他執行緒喚醒此執行緒或者超過指定時間或者超過某個實際時間,之後該執行緒進入就緒狀態

notify()

喚醒該物件上的指定單個執行緒

notifyall()

喚醒該物件上的所有執行緒

package cn.kkcoder.thread;

public

class

waitandnotify

}}class notifythread extends thread

@override

public

void

run()

}}

控制台:

main .start()

main .wait()

t1 call notify()

main .結束

總結: wait() 方法是指讓當前執行緒等待,並釋放物件鎖, 而此時的當前執行緒是 主線程,因為主線程獲取了物件 t 的鎖,t.start()之後,新建執行緒t1,並進入就緒狀態,但是此時鎖在 main 執行緒中,所以t1的run方法不執行,當t.wait()之後,當前執行緒(即主線程)進入等待(阻塞)狀態,並釋放t執行緒鎖,於是執行run方法,喚醒等待的main執行緒,並且執行緒t1釋放鎖進入死亡狀態.main執行緒繼續執行.

tips:wait()指當先執行緒進入等待狀態.
package cn.kkcoder.thread;

public

class

notifyall catch (interruptedexception e)

synchronized (obj)

}static class notifyallclass extends thread

@override

public

void

run() catch (interruptedexception e) }}

}}

控制台:

main sleep 3000 ms

t1 執行 wait

t3 執行 wait

t2 執行 wait

main 喚醒所有執行緒

t2繼續 執行

t3繼續 執行

t1繼續 執行

t1,t2,t3和主線程 分別執行, t1,t2,t3執行緒分別 持有ojb物件,並執行了等待,並釋放各自的鎖,都進入阻塞狀態,主線程(mian)執行緒 sleep 之後,獲取obj物件的鎖,執行notifyall,喚醒所有執行緒.t1,t2,t3之後並執行結束,釋放obj的同步鎖,之後被喚醒並繼續執行.

最後: notify() 和 wait() 等方法依賴於 同步鎖 ,同步鎖依賴於 物件,所以,這些方法也是依賴於 物件 的.

package cn.kkcoder.thread;

public

class

yieldtet

static class testyield extends thread

@override

public

void

run() }}

}}

}

控制台:

t1 i = 0

t1 執行yield

t1 i = 1

t1 i = 2

t1 i = 3

t1 執行yield

t1 i = 4

t1 i = 5

t2 i = 0

t2 執行yield

t2 i = 1

t2 i = 2

t2 i = 3

t2 執行yield

t2 i = 4

t2 i = 5

yield() 方法會進行讓步,但不會釋放同步鎖.即yield會把該執行緒從執行狀態,轉換到 就緒狀態.

執行緒的等待與喚醒

等待喚醒機制 需要用到的方法 wait 執行緒不在活動,不在參與排程,進入wait set中,因此不會去浪費cpu資源,也不會競爭鎖,這是的執行緒狀態為waiting,它需要別的執行緒執行notify操作,這個執行緒才從wait set 中釋放出來,重新回到排程佇列中。notify 選中所通知物件的...

執行緒等待與喚醒的例子

package cn.dali3.code06 模擬乙個小a買冰淇淋的例子。首先,小a告訴店員要吃什麼味道的冰淇淋。之後,小a開始等待,店員開始做 店員做好了交給小a,開始吃。這個例子就是2個執行緒之間的通訊模擬,小a是乙個執行緒,店員是另外乙個執行緒 很顯然這兩個執行緒是不可以同時進行的,所以在設...

執行緒等待喚醒機制

等待喚醒機制 乙個執行緒在工作時發現某些條件不滿足了,這時可以釋放掉鎖,並暫停工作。目的是讓另乙個執行緒插入進來,進行條件的補給 後進入的執行緒在補足條件後,可以進行 喚醒 將之前所有等待的執行緒喚醒,讓他們繼續工作,然後自己退出。喚醒之後執行的 system.out.println 包子已經做好了...