package thread;
/*** 產品倉庫類
* @author wxg1022**/
public class productlist catch(exception e)
}system.out.println("我來生產1個!");
//注意:notifyall()以後,並沒有退出,而是繼續執行直到完成
productlist[index]=product;
index++;
//因為我們不確定有沒有執行緒在wait(),所以我們既然生產了產品,就喚醒有可能等待的消費者,讓他們醒來,準備消費
notifyall();
system.out.println(" "+product.getproducedby()+" sent a notifyall()");
}//pop用來讓消費者取出產品
public synchronized product pop(string consumername)catch(exception e)
}system.out.print("我來消費1個!");
index--;
product product=productlist[index];
product.consume(consumername);
system.out.print("還剩"+index+"個產品,"+product.getconsumedby()+ " 消費了:"+product);
//因為我們不能確定有沒有執行緒在wait(),所以我們既然消費了產品,就喚醒有可能等待的生產者,讓他們醒來,準備生產
notifyall();
system.out.println(" "+consumername+" send a notifyall()");
return product;} }
package thread;
/*** 產品類
* @author wxg1022**/
public class product
//消費,需要指定消費者的名字
public void consume(string consumedby)
public string tostring()
//以下是get/set方法
public string getproducedby()
public void setproducedby(string producedby)
public string getconsumedby()
public void setconsumedby(string consumedby)
}package thread;
/*** 生產者類
* @author wxg1022**/
public class producer implements runnable
@override
public void run() catch(exception ee)}}
}package thread;
public class consumer implements runnable
@override
public void run() catch(exception ee)}}
}package thread;
public class producercusumer
}執行結果如下:
我來生產1個!
生產者x sent a notifyall()
我來生產1個!
生產者y sent a notifyall()
消費者a進來消費!
我來消費1個!還剩1個產品,消費者a 消費了:產品[生產者=生產者y,消費者=消費者a] 消費者a send a notifyall()
消費者b進來消費!
我來消費1個!還剩0個產品,消費者b 消費了:產品[生產者=生產者x,消費者=消費者b] 消費者b send a notifyall()
消費者c進來消費!
沒有可以消費的,所以消費者c等等再消費
我來生產1個!
生產者y sent a notifyall()
我來消費1個!還剩0個產品,消費者c 消費了:產品[生產者=生產者y,消費者=消費者c] 消費者c send a notifyall()
消費者a進來消費!
沒有可以消費的,所以消費者a等等再消費
消費者b進來消費!
沒有可以消費的,所以消費者b等等再消費
我來生產1個!
生產者y sent a notifyall()
我來消費1個!還剩0個產品,消費者b 消費了:產品[生產者=生產者y,消費者=消費者b] 消費者b send a notifyall()
沒有可以消費的,所以消費者a等等再消費
我來生產1個!
生產者x sent a notifyall()
我來消費1個!還剩0個產品,消費者a 消費了:產品[生產者=生產者x,消費者=消費者a] 消費者a send a notifyall()
消費者a進來消費!
沒有可以消費的,所以消費者a等等再消費
消費者b進來消費!
沒有可以消費的,所以消費者b等等再消費
消費者c進來消費!
沒有可以消費的,所以消費者c等等再消費
我來生產1個!
生產者x sent a notifyall()
我來消費1個!還剩0個產品,消費者c 消費了:產品[生產者=生產者x,消費者=消費者c] 消費者c send a notifyall()
沒有可以消費的,所以消費者b等等再消費
我來生產1個!
生產者y sent a notifyall()
我來消費1個!還剩0個產品,消費者a 消費了:產品[生產者=生產者y,消費者=消費者a] 消費者a send a notifyall()
沒有可以消費的,所以消費者b等等再消費
消費者c進來消費!
沒有可以消費的,所以消費者c等等再消費
消費者a進來消費!
沒有可以消費的,所以消費者a等等再消費
我來生產1個!
生產者y sent a notifyall()
我來消費1個!還剩0個產品,消費者a 消費了:產品[生產者=生產者y,消費者=消費者a] 消費者a send a notifyall()
沒有可以消費的,所以消費者c等等再消費
沒有可以消費的,所以消費者b等等再消費
我來生產1個!
生產者x sent a notifyall()
我來消費1個!還剩0個產品,消費者b 消費了:產品[生產者=生產者x,消費者=消費者b] 消費者b send a notifyall()
沒有可以消費的,所以消費者c等等再消費
我來生產1個!
生產者y sent a notifyall()
我來消費1個!還剩0個產品,消費者c 消費了:產品[生產者=生產者y,消費者=消費者c] 消費者c send a notifyall()
消費者b進來消費!
沒有可以消費的,所以消費者b等等再消費
我來生產1個!
生產者y sent a notifyall()
......................................
從以上執行的結果可以得出如下幾點結論
1執行notifyall()後,對於等待中的執行緒不能確地是誰能獲取執行的機會。
2當執行wait()後,該執行緒後續的**將會暫停執行,等獲取執行機會後會接著執行,而不是重新執行。
3使用while而不是用if的原因
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者和消費者
package demo.one public class producerconsumerdemo 資源 class resource catch interruptedexception e this.name name count system.out.println thread.curre...
生產者和消費者
package com.yuxinyicheng.test2 生產者和消費者的問題 生產者將產品交給店員,而消費者從店員處取走產品,店員一次只能有固定數量的產品 比如 20個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...