Java 多線程實現生產者消費者問題(wait/notify)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.