java多線程 生產消費者模型

[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

相關文章
相關標籤/搜索