生產者消費者問題是執行緒模型中的經典問題:生產者和消費者在同一時間段內共用同一儲存空間,生產者向空間裡生成資料,而消費者取走資料。
此處實現如下情況的生產-消費模型:
生產者不斷交替地生產兩組資料「姓名--1 ---> 內容--1」,「姓名--2 --->內容--2」,消費者不斷交替地獲取這兩組資料,這裡的「姓名--1」和「姓名--2」模擬為資料的名稱,「內容--1」和「內容--2」模擬為資料的內容。
由於程式中涉及到執行緒執行的不確定性,因此可能會出現以下問題:
問題1要靠同步來解決,問題2要靠執行緒間通訊,生產者執行緒放入資料後,通知消費者執行緒取出資料,消費者執行緒取出資料後,通知生產者執行緒生產資料,這裡用wait/notify機制來實現。
具體code:
class info catch (interruptedexception e)
}this.setname(name);//設定名稱
try catch (interruptedexception e)
this.setcontent(content);//設定內容
flag = false;//改變標誌位,表示可以取走
super.notify();
}public synchronized void get() catch (interruptedexception e)
} try catch (interruptedexception e)
system.out.println(this.getname() + " -->" + this.getcontent());
flag = true;//改變標誌位,表示可以生產
super.notify();
}public void setname(string name)
public void setcontent(string content)
public string getname()
public string getcontent()
}class producer implements runnable
public void run() else }}
}class consumer implements runnable
public void run()
} } public class threadcasedemo03catch(interruptedexception e)
new thread(con).start() ;
} }
執行結果如下:
另外,在run方法中,二者迴圈的次數要相同,否則,當一方的迴圈結束的時候,另一方的迴圈依然在繼續,它會阻塞在wait()方法處,而等不到對方的notify通知。
Java 生產者消費者模型
1.基於synchronzied底層,與wait notifyall實現 object類提供的wait notify方法,配合synchronized使用,操作更底層,可擴充套件性和可控制性小。先來介紹一下wait notify notifyall 方法 wait object類的方法,只能在同步方...
生產者消費者模型
1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...
生產者消費者模型
生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...