[seriesposts sid=500]
下面的代碼講述了一個故事
一個麪包生產鋪裏目前有30個麪包,有三我的來買麪包,第一我的要買50個,第二個要買20個,第三個要買30個。
第一我的不夠,因此等着,讓第二個買了。麪包鋪繼續生產麪包。有7我的在生產。
java
package com.javaer.thread; public class CPMode { public static void main(String[] args) { Godown godown = new Godown(30); //初始化庫存 30個食物 Consumer c1 = new Consumer(50, godown); Consumer c2 = new Consumer(20, godown); Consumer c3 = new Consumer(30, godown); Producer p1 = new Producer(10, godown); Producer p2 = new Producer(10, godown); Producer p3 = new Producer(10, godown); Producer p4 = new Producer(10, godown); Producer p5 = new Producer(10, godown); Producer p6 = new Producer(10, godown); Producer p7 = new Producer(80, godown); c1.start(); c2.start(); c3.start(); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); p6.start(); p7.start(); } } /** * 倉庫 */ class Godown { public static final int max_size = 100; //最大庫存量 public int curnum; //當前庫存量 Godown() { } Godown(int curnum) { this.curnum = curnum; } /** * 生產指定數量的產品 * * @param neednum */ public synchronized void produce(int neednum) { //測試是否須要生產 while (neednum + curnum > max_size) { System.out.println("要生產的產品數量" + neednum + "超過剩餘庫存量" + (max_size - curnum) + ",暫時不能執行生產任務!"); try { //當前的生產線程等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //知足生產條件,則進行生產,這裏簡單的更改當前庫存量 curnum += neednum; System.out.println("已經生產了" + neednum + "個產品,現倉儲量爲" + curnum); //喚醒在此對象監視器上等待的全部線程 notifyAll(); } /** * 消費指定數量的產品 * * @param neednum */ public synchronized void consume(int neednum) { //測試是否可消費 while (curnum < neednum) { try { //當前的消費線程等待 wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //知足消費條件,則進行消費,這裏簡單的更改當前庫存量 curnum -= neednum; System.out.println("已經消費了" + neednum + "個產品,現倉儲量爲" + curnum); //喚醒在此對象監視器上等待的全部線程 notifyAll(); } } /** * 生產者 */ class Producer extends Thread { private int neednum; //生產產品的數量 private Godown godown; //倉庫 Producer(int neednum, Godown godown) { this.neednum = neednum; this.godown = godown; } public void run() { //生產指定數量的產品 godown.produce(neednum); } } /** * 消費者 */ class Consumer extends Thread { private int neednum; //生產產品的數量 private Godown godown; //倉庫 Consumer(int neednum, Godown godown) { this.neednum = neednum; this.godown = godown; } public void run() { //消費指定數量的產品 godown.consume(neednum); } }
已經消費了20個產品,現倉儲量爲10
已經生產了10個產品,現倉儲量爲20
已經生產了10個產品,現倉儲量爲30
已經生產了10個產品,現倉儲量爲40
已經生產了10個產品,現倉儲量爲50
已經消費了30個產品,現倉儲量爲20
已經生產了80個產品,現倉儲量爲100
已經消費了50個產品,現倉儲量爲50
已經生產了10個產品,現倉儲量爲60
已經生產了10個產品,現倉儲量爲70
首發於http://java-er.com - http://java-er.com/blog/java-thread-consumer/
看了不後悔,學習編程的八個建議
你會遇到的30個JAVA面試題
俄羅斯方塊設計原理
Android教程二:Android 工程文件說明大全
java高性能編程的26個注意事項
一位外國網賺達人的五個寫博客建議android