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--生产出--韭菜-韭菜有益
。。。。