標籤: 多執行緒
所有的等待和喚醒執行緒,都是針對某個具體物件例項
的.
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 包子已經做好了...