執行緒之間的通訊:
多個執行緒在處理同乙個資源,但是處理的動作(執行緒的任務)卻不相同。通過一定的手段使各個執行緒能有效的利用資源。而這種手段即—— 等待喚醒機制。
等待喚醒機制所涉及到的方法:
wait() :等待,將正在執行的執行緒釋放其執行資格 和 執行權,並儲存到執行緒池中。
notify():喚醒,喚醒執行緒池中被wait()的執行緒,一次喚醒乙個,而且是任意的。
notifyall(): 喚醒全部:可以將執行緒池中的所有wait() 執行緒都喚醒。
注意:這些方法都要標記其使用的鎖,即 隱式的同步監視器
eg:生產者和消費者問題
生產者消費者問題,也稱有限緩衝問題,是乙個多執行緒同步問題的經典案例。該問題描述了共享固定大小緩衝區的兩個執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。
要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。
/*分別建立兩個執行緒生產和消費*/
class
producerconsumerdemo
}/*需要滿足的是生產者與消費者之間的同步,每乙個動作執行的臨界區互斥。保證無論是生產還是消費,都只有乙個執行緒在執行,所以要給生產消費過程加鎖。*/
class
resource
catch(exception e){}
this.name = name+"--"+count++;
system.out.println(thread.currentthread().getname()+"...生產者.."+this.name);
flag = true;
this.notifyall();
/*不能使用notify(),因為需要喚醒對方執行緒。用notify容易出現只喚醒本方執行緒的情況,導致程式中的所有執行緒都等待。*/
}public synchronized void out()
catch(exception e){}
system.out.println(thread.currentthread().getname()+"...消費者......"+this.name);
flag = false;
this.notifyall();
}}class
producer
implements
runnable
public
void run()
}}class
consumer
implements
runnable
public
void run()
}}
多執行緒3 執行緒間通訊
這兩種方法都要在同步 塊或同步方法中呼叫。都需要先獲得物件級別的鎖。只有兩個方法的物件鎖一致,即 物件監視器 一致,再能通過notify方法通知到執行wait方法的執行緒繼續執行。使用wait方法後,該執行緒會釋放物件鎖,並進入阻塞佇列等待被喚醒。notify方法喚醒wait方法後,該執行緒進入就緒...
執行緒通訊,多執行緒
多執行緒 thread handler thread處理一些複雜的業務邏輯 耗時的事情 handler在主線程中接收訊息的乙個物件 mhandler.sendmessage msg 傳送乙個訊息物件 mhandler.sendemptymessage what 傳送空訊息,只有what沒有obj m...
多執行緒 執行緒通訊
總結 今天小鹹兒來講解乙個好玩的事,那就是執行緒之間該如何通訊,執行緒通訊之後又會出現什麼問題?先來一張導圖來看看執行緒通訊的分布?疑問 如果想要執行緒按照使用者自定義的順序執行的話,那該如何操作呢?思考 如果能夠讓執行緒等待先執行的執行緒執行完,再執行不就能達到效果了嗎!果然出現問題之後,就會有對...