執行緒間通訊
多個執行緒併發執行時, 在預設情況下cpu是隨機切換執行緒的,當我們需要多個執行緒來共同完成一件任務,並且我們希望他們有規律的執行, 那麼多執行緒之間需要一些協調通訊,以此來幫我們達到多執行緒共同操作乙份資料。
如何保證執行緒間通訊有效利用資源:
多個執行緒在處理同乙個資源,並且任務不同時,需要執行緒通訊來幫助解決執行緒之間對同乙個變數的使用或操作。 就是多個執行緒在操作同乙份資料時, 避免對同一共享變數的爭奪。也就是我們需要通過一定的手段使各個執行緒能有效的利用資源。而這種手段即—— 等待喚醒機制。
什麼是等待喚醒機制
這是多個執行緒間的一種協作機制。談到執行緒我們經常想到的是執行緒間的競爭(race),比如去爭奪鎖,但這並不是故事的全部,執行緒間也會有協作機制。就好比在公司裡你和你的同事們,你們可能存在在晉公升時的競爭,但更多時候你們更多是一起合作以完成某些任務。就是在乙個執行緒進行了規定操作後,就進入等待狀態(wait()), 等待其他執行緒執行完他們的指定**過後 再將其喚醒(notify());在有多個執行緒進行等待時, 如果需要,可以使用 notifyall()來喚醒所有的等待執行緒。wait/notify 就是執行緒間的一種協作機制。
等待喚醒中的方法
等待喚醒機制就是用於解決執行緒間通訊的問題的,使用到的3個方法的含義如下:
wait:執行緒不再活動,不再參與排程,進入 wait set 中,因此不會浪費 cpu 資源,也不會去競爭鎖了,這時的執行緒狀態即是waiting。它還要執行乙個特別的動作,也即是「通知(notify)」在這個物件上等待的執行緒從wait set 中釋放出來,重新進入到排程佇列(ready queue)中
notify:則選取所通知物件的 wait set 中的乙個執行緒釋放;例如,餐館有空位置後,等候就餐最久的顧客最先入座。
notifyall:則釋放所通知物件的 wait set 上的全部執行緒。
注意: 哪怕只通知了乙個等待的執行緒,被通知執行緒也不能立即恢復執行,因為它當初中斷的地方是在同步塊內,而此刻它已經不持有鎖,所以她需要再次嘗試去獲取鎖(很可能面臨其它執行緒的競爭),成功後才能在當初調 用 wait 方法之後的地方恢復執行。總結如下:
呼叫wait和notify方法需要注意的細節
wait方法與notify方法必須要由同乙個鎖物件呼叫。因為:對應的鎖物件可以通過notify喚醒使用同乙個鎖物件呼叫的wait方法後的執行緒。
wait方法與notify方法是屬於object類的方法的。因為:鎖物件可以是任意物件,而任意物件的所屬類都是繼承了object類的。
wait方法與notify方法必須要在同步**塊或者是同步函式中使用。因為:必須要通過鎖物件呼叫這2個方法。
執行緒等待喚醒機制
等待喚醒機制 乙個執行緒在工作時發現某些條件不滿足了,這時可以釋放掉鎖,並暫停工作。目的是讓另乙個執行緒插入進來,進行條件的補給 後進入的執行緒在補足條件後,可以進行 喚醒 將之前所有等待的執行緒喚醒,讓他們繼續工作,然後自己退出。喚醒之後執行的 system.out.println 包子已經做好了...
等待喚醒機制
等待喚醒機制是多執行緒通訊中的概念,首先我們要先了解什麼是執行緒間的通訊 概念 多個執行緒都在處理同乙個資源,但是處理的任務不一樣。此時就需要多執行緒之間進行通訊,保證同一資源的正確性。剖析 通過多執行緒間的通訊的經典例項來進一步了解多執行緒間通訊的概念 經典例項 生產者,消費者 1 首先通過乙個簡...
等待喚醒機制
等待喚醒機制 涉及的方法 wait 將同步中的執行緒處於凍結狀態。釋放了執行權,釋放了資格。同時將執行緒物件儲存到執行緒池中。notify 喚醒執行緒池中某乙個等待執行緒。notifyall 喚醒的是執行緒池中的所有執行緒。注意 1 這些方法都需要定義在同步中。2 因為這些方法必須要標示所屬的鎖。你...