等待與喚醒機制

2022-09-15 13:51:23 字數 2454 閱讀 3037

1、執行緒間通訊

概念:多執行緒在處理同乙個資源,但是處理的動作卻不相同。

為什麼處理執行緒間通訊?

多執行緒併發執行時,在預設情況下cpu是隨機切換執行緒的,當我們需要多執行緒來共同完成一件任務,並且我們希望他們有規律的執行,那麼多執行緒之間需要一些協調通訊,以此來幫我們達到多執行緒共同操作乙份資料。

如何保證執行緒間通訊有效利用資源?

多執行緒在處理同乙個資源,並且任務不同時,需要執行緒通訊來幫忙解決執行緒間對同一變數的使用或操作。就是多執行緒在操作同乙份資料時,避免對同一共享變數的爭奪。也就是我們需要通過一定的手段使各個執行緒能有效利用資源。而這種手段即——等待喚醒機制。

2、等待喚醒機制

概念:這是多執行緒間的協作機制。談到執行緒我們經常想到的是執行緒間的競爭,比如去爭奪鎖,但這並不是故事的全部,執行緒間也會有協作機制。就好比在公司裡你和你的同事們,你們可能存在晉公升的競爭,但更多時候你們更多是一起合作完成某些任務。

就是在乙個執行緒金信諾過了規定操作後,就進入等待狀態(wait()),等待其他執行緒執行完他們的指定**過後再將其喚醒(notify());在有多個執行緒進行等待時,如果需要,可以使用notify all()來喚醒所有的等待執行緒。wait/notify就是執行緒間的一種協作機制。

等待喚醒中的方法:

等待喚醒機制就是解決執行緒間通訊的問題的,使用到的3個方法的含義如下:

1、wait:執行緒不再活動,不再參與排程,進入wait set中,因此不會浪費cup資源,也不會去競爭鎖了,這時的執行緒狀態即是waiting。它還要等著別的執行緒執行乙個特別的動作,就是通知(notify)在這個物件上等待的執行緒從wait set中釋放出來,重新進入排程佇列(ready queue)中。

2、notify:則選取所有通知物件的wiat set 中的乙個執行緒釋放;例如,餐館有空位置後,等候就餐最久的顧客最先入座。

3、notifyall:則釋放所通知物件的wait set 上的全部執行緒。

包子類:

public class baozi 

​public baozi(string pi, string xian, boolean flag)

​public string getpi()

​public void setpi(string pi)

​public string getxian()

​public void setxian(string xian)

​public boolean isflag()

​public void setflag(boolean flag)

}

包子鋪:

public class baozipu implements runnable 

​public baozipu(baozi bz)

​//生產包子

@override

public void run() catch (interruptedexception e)

}//被喚醒之後執行,包子鋪生產包子

if (count%2==0)else

count++;

system.out.println("包子鋪正在生產:"+bz.getpi()+bz.getxian()+"包子");

//生產包子

try catch (interruptedexception e)

//包子好了後,修改狀態

bz.setflag(true);

bz.notify();//喚醒客人的執行緒

system.out.println("包子生產完畢");}}

}}

客人:

public class chihuo implements runnable 

​public chihuo(baozi baozi)

​public baozi getbaozi()

​public void setbaozi(baozi baozi)

​@override

public void run() catch (interruptedexception e)

}//喚醒之後,吃包子

system.out.println("吃"+baozi.getpi()+baozi.getxian()+"的包子");

baozi.setflag(false);//包子吃完了

baozi.notify();//喚醒去做包子

system.out.println("包子吃完了");}}

}}

測試:

public class demo05main 

}

等待喚醒機制

等待喚醒機制是多執行緒通訊中的概念,首先我們要先了解什麼是執行緒間的通訊 概念 多個執行緒都在處理同乙個資源,但是處理的任務不一樣。此時就需要多執行緒之間進行通訊,保證同一資源的正確性。剖析 通過多執行緒間的通訊的經典例項來進一步了解多執行緒間通訊的概念 經典例項 生產者,消費者 1 首先通過乙個簡...

等待喚醒機制

等待喚醒機制 涉及的方法 wait 將同步中的執行緒處於凍結狀態。釋放了執行權,釋放了資格。同時將執行緒物件儲存到執行緒池中。notify 喚醒執行緒池中某乙個等待執行緒。notifyall 喚醒的是執行緒池中的所有執行緒。注意 1 這些方法都需要定義在同步中。2 因為這些方法必須要標示所屬的鎖。你...

執行緒等待喚醒機制

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