生產者和消費者

2021-08-30 14:40:47 字數 3773 閱讀 7865

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個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...