java学习之生产者和消费者案例

  1 package com.gh.thread;
  2 /**
  3  * 生产者和消费者案例
  4  * wait和sleep的区别
  5  * wait不让出监视器锁,sleep让出监视器的锁
  6  * @author ganhang
  7  *
  8  */
  9 /**
 10  * 生产者
 11  * @author ganhang
 12  *
 13  */
 14 class Producter implements Runnable{
 15     private Food food;
 16     public Producter(Food food){
 17         this.food=food;
 18     }
 19     @Override
 20     public void run() {
 21         for(int i=0;i<100;i++){
 22             if(i%2==0){
 23                 food.product("韭菜", "韭菜有益");
 24             }else{ 
 25                 food.product("腰花", "腰花好吃");
 26             }
 27         }
 28     } 
 29     
 30 }
 31 /**
 32  * 消费者
 33  * @author ganhang
 34  *
 35  */
 36 class Consumer implements Runnable{
 37     private Food food;
 38     public Consumer(Food food) {
 39         this.food=food;
 40     }
 41     @Override
 42     public void run() {
 43         for(int i=0;i<100;i++){
 44             food.get();
 45         }        
 46     }
 47     
 48 }
 49 /**
 50  * 产品对象
 51  * @author ganhang
 52  *
 53  */
 54 class Food{
 55     private String name;
 56     private String info;
 57     private boolean flag=true;//true表示可以生产,false表示可以消费
 58     //生产产品
 59     public synchronized void product(String name,String info){
 60         if(!flag){//如果为false说明正在消费
 61             try {
 62                 //让当前线程进入等待池等待,没有设置时间,需要其他线程唤醒,释放对象锁,让出cpu;
 63                 this.wait();
 64             } catch (InterruptedException e) {
 65                 e.printStackTrace();
 66             }
 67         }
 68         this.setName(name);
 69         try {
 70             Thread.sleep(1000);
 71         } catch (InterruptedException e) {
 72             e.printStackTrace();
 73         }
 74         this.setInfo(info);
 75         System.out.println(Thread.currentThread().getName()+"--生产出--"+
 76                             this.getName()+"-"+this.getInfo());
 77         flag=false;//生产完成表示可以进行消费了
 78         this.notify();//唤醒该监视器的一个线程
 79     }
 80     //消费产品
 81     public synchronized void get(){
 82         if(flag){//如果为ture说明正在生产
 83             try {
 84                 this.wait();//同样让它等待
 85             } catch (InterruptedException e) {
 86                 e.printStackTrace();
 87             }
 88         }
 89             try {
 90                 Thread.sleep(1000);
 91             } catch (InterruptedException e) {
 92                 e.printStackTrace();
 93             } 
 94             System.out.println(Thread.currentThread().getName()+"--已送出--"+
 95                         this.getName()+"-"+this.getInfo());
 96             flag=true;//消费完可以生产了
 97             this.notify();//唤醒一个线程
 98     }
 99     public String getName() {
100         return name;
101     }
102     public void setName(String name) {
103         this.name = name;
104     }
105     public String getInfo() {
106         return info;
107     }
108     public Food() {
109         super();
110     }
111     public Food(String name, String info) {
112         super();
113         this.name = name;
114         this.info = info;
115     }
116     @Override
117     public String toString() {
118         return "food [name=" + name + ", info=" + info + "]";
119     }
120     public void setInfo(String info) {
121         this.info = info;
122     }
123 }
124 public class ThreadDemo {
125     public static void main(String[] args) {
126         Food f=new Food();
127         Producter p=new Producter(f);
128         Consumer c=new Consumer(f);
129         new Thread(p,"线程p").start();
130         new Thread(c,"线程c").start();
131     }
132 }

 输出

线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益
线程c--已送出--韭菜-韭菜有益
线程p--生产出--腰花-腰花好吃
线程c--已送出--腰花-腰花好吃
线程p--生产出--韭菜-韭菜有益

。。。。

posted @ 2016-01-23 23:35  CodeNoob  阅读(327)  评论(0编辑  收藏  举报