首页 > 学院 > 开发设计 > 正文

Java程序设计之消费者和生产者

2019-11-15 00:59:52
字体:
来源:转载
供稿:网友
java程序设计之消费者和生产者

  新建一个Break类,表示食物数量。

public class Break {    public static final int MAX = 10;  //最多一次性煮十个面包    Stack<Integer> stack = new Stack<Integer>();    public static int food_count = 0; //统计食物的个数        //做面包    public synchronized void make_food(int number){        stack.push(number);        food_count++;    }        //吃食物    public synchronized int eat_food(){        food_count--;        return stack.pop();    }}

  在创建一个厨房类,为了制作食物或者是消耗食物,若食物没有了,则消费者进入wait(),生产者开始制作食物,随后唤醒等待的消费者。

public class Kitchen {    PRivate Break food ;    public static int people1_eatnumber = 0;//第一个人吃的面包数量    public static int people2_eatnumber = 0;//第二个人吃的面包数量    public static final int TOTOAL_NUM = 100;//总共做的面包数量    public static int icount = 1;//统计做过的面包数量        public Kitchen(Break food){        this.food = food;    }        //做面包的方法    public synchronized void make(){        if(food.food_count<10){//锅是不是满了            food.make_food(Kitchen.icount);            System.out.println("做完了第"+Kitchen.icount+"个食物。");            Kitchen.icount++;            notifyAll();//食物有了,找两个人来吃面包        }else{            System.out.println("锅已经装满,一次性装十个,等待两人吃食物。");            try {                wait();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }//进入阻塞状态,等待消费者唤醒        }    }        //吃面包的方法    public synchronized void eat(){        if(food.food_count>0){            int temp = food.eat_food();//吃掉面包的编号            System.out.println(Thread.currentThread().getName()+"吃掉了第"+temp+"个食物");            if(Thread.currentThread().getName().equals("一号")){                people1_eatnumber++;            }else{                people2_eatnumber++;            }            notifyAll();  //唤醒继续做面包        }else{            System.out.println("食物吃完了,等待重新烹饪。");            try {                wait();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

  下面进入消费者和生产者类的构造,传递给一个Kitchen对象,其中消费者调用Kitchen类中的吃方法。

public class consumer implements Runnable {    Kitchen kitchen;        public consumer(Kitchen kitchen){        this.kitchen = kitchen;    }    @Override    public void run() {        // TODO Auto-generated method stub        while(true){            if(kitchen.icount>100&&Break.food_count<=0){                break;            }            try{                kitchen.eat();                Thread.sleep(100);            }catch(Exception e){                e.printStackTrace();            }        }    }}

  然而生产者则是调用了Kitchen对象中的制作方法。

public class product implements Runnable {    private Kitchen kitchen;    public product(Kitchen kitchen){        this.kitchen = kitchen;    }    @Override    public void run() {        // TODO Auto-generated method stub        while(true){            //结束这个线程            if(Kitchen.icount > 100){                break;            }            try{                                kitchen.make();                Thread.sleep(100);                }catch(Exception e){                e.printStackTrace();            }        }        System.out.println("厨房食物材料已经做完。");    }}

  下面开始写主类,包括了main方法,启动程序,创建一个test类,实现:

public class test {    public static void main(String[] args){        Break brake = new Break();        Kitchen kitchen = new Kitchen(brake);        product p = new product(kitchen);        consumer c1 = new consumer(kitchen);        consumer c2 = new consumer(kitchen);                Thread food = new Thread(p,"食物");        Thread people1 = new Thread(c1,"一号");        Thread people2 = new Thread(c2,"二号");                food.start();        people1.start();        people2.start();                try{            food.join();            people1.join();            people2.join();        }catch(Exception e){            e.printStackTrace();        }                System.out.println("一号吃了"+Kitchen.people1_eatnumber);        System.out.println("二号吃了"+Kitchen.people2_eatnumber);    }}

输出结果如下:

做完了第1个食物。二号吃掉了第1个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第2个食物。一号吃掉了第2个食物食物吃完了,等待重新烹饪。做完了第3个食物。一号吃掉了第3个食物食物吃完了,等待重新烹饪。做完了第4个食物。一号吃掉了第4个食物做完了第5个食物。二号吃掉了第5个食物食物吃完了,等待重新烹饪。做完了第6个食物。二号吃掉了第6个食物食物吃完了,等待重新烹饪。做完了第7个食物。二号吃掉了第7个食物做完了第8个食物。一号吃掉了第8个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第9个食物。一号吃掉了第9个食物食物吃完了,等待重新烹饪。做完了第10个食物。一号吃掉了第10个食物做完了第11个食物。二号吃掉了第11个食物食物吃完了,等待重新烹饪。做完了第12个食物。二号吃掉了第12个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第13个食物。一号吃掉了第13个食物做完了第14个食物。二号吃掉了第14个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第15个食物。一号吃掉了第15个食物做完了第16个食物。二号吃掉了第16个食物食物吃完了,等待重新烹饪。做完了第17个食物。二号吃掉了第17个食物食物吃完了,等待重新烹饪。做完了第18个食物。二号吃掉了第18个食物食物吃完了,等待重新烹饪。做完了第19个食物。二号吃掉了第19个食物食物吃完了,等待重新烹饪。做完了第20个食物。二号吃掉了第20个食物食物吃完了,等待重新烹饪。做完了第21个食物。二号吃掉了第21个食物食物吃完了,等待重新烹饪。做完了第22个食物。二号吃掉了第22个食物食物吃完了,等待重新烹饪。做完了第23个食物。二号吃掉了第23个食物食物吃完了,等待重新烹饪。做完了第24个食物。二号吃掉了第24个食物食物吃完了,等待重新烹饪。做完了第25个食物。二号吃掉了第25个食物食物吃完了,等待重新烹饪。做完了第26个食物。二号吃掉了第26个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第27个食物。一号吃掉了第27个食物食物吃完了,等待重新烹饪。做完了第28个食物。一号吃掉了第28个食物食物吃完了,等待重新烹饪。做完了第29个食物。一号吃掉了第29个食物做完了第30个食物。二号吃掉了第30个食物食物吃完了,等待重新烹饪。做完了第31个食物。二号吃掉了第31个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第32个食物。一号吃掉了第32个食物食物吃完了,等待重新烹饪。做完了第33个食物。一号吃掉了第33个食物食物吃完了,等待重新烹饪。做完了第34个食物。一号吃掉了第34个食物做完了第35个食物。二号吃掉了第35个食物食物吃完了,等待重新烹饪。做完了第36个食物。二号吃掉了第36个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第37个食物。一号吃掉了第37个食物食物吃完了,等待重新烹饪。做完了第38个食物。一号吃掉了第38个食物食物吃完了,等待重新烹饪。做完了第39个食物。一号吃掉了第39个食物做完了第40个食物。二号吃掉了第40个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第41个食物。一号吃掉了第41个食物做完了第42个食物。二号吃掉了第42个食物做完了第43个食物。二号吃掉了第43个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第44个食物。一号吃掉了第44个食物食物吃完了,等待重新烹饪。做完了第45个食物。一号吃掉了第45个食物做完了第46个食物。二号吃掉了第46个食物食物吃完了,等待重新烹饪。做完了第47个食物。二号吃掉了第47个食物食物吃完了,等待重新烹饪。做完了第48个食物。二号吃掉了第48个食物食物吃完了,等待重新烹饪。做完了第49个食物。二号吃掉了第49个食物食物吃完了,等待重新烹饪。做完了第50个食物。二号吃掉了第50个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第51个食物。一号吃掉了第51个食物食物吃完了,等待重新烹饪。做完了第52个食物。一号吃掉了第52个食物做完了第53个食物。二号吃掉了第53个食物做完了第54个食物。一号吃掉了第54个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第55个食物。做完了第56个食物。二号吃掉了第56个食物一号吃掉了第55个食物做完了第57个食物。一号吃掉了第57个食物食物吃完了,等待重新烹饪。做完了第58个食物。一号吃掉了第58个食物做完了第59个食物。二号吃掉了第59个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第60个食物。一号吃掉了第60个食物做完了第61个食物。二号吃掉了第61个食物食物吃完了,等待重新烹饪。做完了第62个食物。二号吃掉了第62个食物食物吃完了,等待重新烹饪。做完了第63个食物。二号吃掉了第63个食物食物吃完了,等待重新烹饪。做完了第64个食物。二号吃掉了第64个食物食物吃完了,等待重新烹饪。做完了第65个食物。二号吃掉了第65个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第66个食物。做完了第67个食物。二号吃掉了第67个食物一号吃掉了第66个食物做完了第68个食物。一号吃掉了第68个食物食物吃完了,等待重新烹饪。做完了第69个食物。一号吃掉了第69个食物食物吃完了,等待重新烹饪。做完了第70个食物。一号吃掉了第70个食物做完了第71个食物。二号吃掉了第71个食物食物吃完了,等待重新烹饪。做完了第72个食物。二号吃掉了第72个食物食物吃完了,等待重新烹饪。做完了第73个食物。二号吃掉了第73个食物食物吃完了,等待重新烹饪。食物吃完了,等待重新烹饪。做完了第74个食物。一号吃掉了第74个食物食物吃完了,等待重新烹饪。做完了第75个食物。一号吃掉了第75个食物做完了第76个食物。二号吃掉了第76个食物食物吃完了,等待重新烹饪。做完了第77个食物。二号吃掉了第77个食物食物吃完了,等待重新烹饪。做完了第78个食物。二号吃掉了第78个食物食物吃完了,等待重新烹饪。做完了第79个食物。二号吃掉了第79个食物食物吃完了,等待重新烹饪。做完了第80个食物。二号吃掉了第80个食物食物吃完了,等待重新烹饪。做完了第81个食物。二号吃掉了第81个食物食物吃完了,等待重新烹饪。做完了第82个食物。二号吃掉了第82个食物食物吃完了,等待重新烹饪。做完了第83个食物。二号吃掉了第83个食物食物吃完了,等待重新烹饪。做完了第84个食物。二号吃掉了第84个食物食物吃完了,等待重新烹饪。做完了第85个食物。二号吃掉了第85个食物食物吃完了,等待重新烹饪。做完了第86个食物。二号吃掉了第86个食物食物吃完了,等待重新烹饪。做完了第87个食物。二号吃掉了第87个食物食物吃完了,等待重新烹饪。做完了第88个食物。二号吃掉了第88个食物做完了第89个食物。二号吃掉了第89个食物食物吃完了,等待重新烹饪。做完了第90个食物。二号吃掉了第90个食物食物吃完了,等待重新烹饪。做完了第91个食物。二号吃掉了第91个食物食物吃完了,等待重新烹饪。做完了第92个食物。二号吃掉了第92个食物食物吃完了,等待重新烹饪。做完了第93个食物。二号吃掉了第93个食物食物吃完了,等待重新烹饪。做完了第94个食物。二号吃掉了第94个食物食物吃完了,等待重新烹饪。做完了第95个食物。二号吃掉了第95个食物食物吃完了,等待重新烹饪。做完了第96个食物。二号吃掉了第96个食物食物吃完了,等待重新烹饪。做完了第97个食物。二号吃掉了第97个食物食物吃完了,等待重新烹饪。做完了第98个食物。二号吃掉了第98个食物食物吃完了,等待重新烹饪。做完了第99个食物。二号吃掉了第99个食物食物吃完了,等待重新烹饪。做完了第100个食物。二号吃掉了第100个食物厨房食物材料已经做完。一号吃了33二号吃了67


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表