標籤:java多線程 生產者消費者 例子 wait notify
本文參考網上一些例子,使用synchronized及對象的wait/notify方法實現。
首先定義3個類,一個是容器類,屬性有容器最大容量和當前容量;
另外兩個分別是生產者和消費者類,二者分別有生產方法和消費方法(均在各自的run方法中實現,實際上最好抽離出來成為一個單獨的方法)
package test3;class Container{public int max; //定義容器最大容量public int currentNum;//定義容器當前容量public Container(int max){this.max = max;currentNum = 0;}}class Producer implements Runnable{public Container con;public Producer(Container con){this.con = con;}public void run(){while(true){//有無數個蘋果synchronized(con){if(con.currentNum < con.max){//若當前容器不滿,則可以生產con.notify();//生產完則通知並釋放鎖con.currentNum++;System.out.println(" 生產者正在生產...+1, 當前產品數:"+con.currentNum);}else if(con.currentNum == con.max){//System.out.println("箱子已經飽和,生產者停止生產,正在等待消費...");try {con.wait();} catch (InterruptedException e) {e.printStackTrace();}}//if else if}//syn執行完同步塊釋放鎖,輸出結果中連續出現兩次生產者是因為:釋放鎖後,若沒有等待線程,則還是先執行到哪個線程的同步塊就執行它try {Thread.sleep(100);//調節生產者頻率,過快容易猝死~~} catch (InterruptedException e) {e.printStackTrace();}//try}//while}}class Consumer implements Runnable{public Container con;public Consumer(Container con){this.con = con;}public void run(){while(true){synchronized(con){if(con.currentNum > 0 ){con.notify();con.currentNum--;System.out.println(" 消費者正在消費...-1, 當前產品數:"+con.currentNum);}else if(con.currentNum == 0){System.out.println("箱子已經空了,消費者停止消費,正在等待生產...");try {con.wait();} catch (InterruptedException e) {e.printStackTrace();}}//else if}//syntry {Thread.sleep(140);//調節消費者頻率,過快容易撐死~~} catch (InterruptedException e) {e.printStackTrace();}//try}//while}// run}public class TestProducerConsumer{public static void main(String args[]){Container container = new Container(5);//定義箱子最大容量,此處為5Producer producer = new Producer(container);//箱子中的蘋果數要同步,所以將箱子物件引用作為形參傳給生產者和消費者Consumer consumer = new Consumer(container);//new Thread(producer, "producer").start();//啟動生產消費模式new Thread(consumer, "consumer").start();}}
程式輸出:
生產者正在生產...+1, 當前產品數:1 消費者正在消費...-1, 當前產品數:0 生產者正在生產...+1, 當前產品數:1 消費者正在消費...-1, 當前產品數:0 生產者正在生產...+1, 當前產品數:1 消費者正在消費...-1, 當前產品數:0 生產者正在生產...+1, 當前產品數:1 消費者正在消費...-1, 當前產品數:0 生產者正在生產...+1, 當前產品數:1 生產者正在生產...+1, 當前產品數:2 消費者正在消費...-1, 當前產品數:1 生產者正在生產...+1, 當前產品數:2 消費者正在消費...-1, 當前產品數:1 生產者正在生產...+1, 當前產品數:2 消費者正在消費...-1, 當前產品數:1 生產者正在生產...+1, 當前產品數:2 生產者正在生產...+1, 當前產品數:3 消費者正在消費...-1, 當前產品數:2 生產者正在生產...+1, 當前產品數:3 消費者正在消費...-1, 當前產品數:2 生產者正在生產...+1, 當前產品數:3 消費者正在消費...-1, 當前產品數:2 生產者正在生產...+1, 當前產品數:3 消費者正在消費...-1, 當前產品數:2 生產者正在生產...+1, 當前產品數:3 生產者正在生產...+1, 當前產品數:4 消費者正在消費...-1, 當前產品數:3 生產者正在生產...+1, 當前產品數:4 消費者正在消費...-1, 當前產品數:3 生產者正在生產...+1, 當前產品數:4 消費者正在消費...-1, 當前產品數:3 生產者正在生產...+1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5箱子已經飽和,生產者停止生產,正在等待消費... 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5箱子已經飽和,生產者停止生產,正在等待消費... 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5箱子已經飽和,生產者停止生產,正在等待消費... 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5箱子已經飽和,生產者停止生產,正在等待消費... 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5箱子已經飽和,生產者停止生產,正在等待消費... 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5 消費者正在消費...-1, 當前產品數:4 生產者正在生產...+1, 當前產品數:5
Java 多線程實現生產者消費者問題(wait/notify)