多线程 wait(),notify()方法,案例总结

来源:互联网 发布:小学试题库软件下载 编辑:程序博客网 时间:2024/05/16 05:49
废话不多说,案例如下

 1 package com.xujingyang.Exok; 2  3 /** 4  * 商品类 5  * @author 徐景洋 6  */ 7 public class Goods { 8     private String pinpai; 9     private String name;10     11     private int num;12     13     public int getNum() {14         return num;15     }16     public void setNum(int num) {17         this.num = num;18     }19     public String getPinpai() {20         return pinpai;21     }22     public void setPinpai(String pinpai) {23         this.pinpai = pinpai;24     }25     public String getName() {26         return name;27     }28     public void setName(String name) {29         this.name = name;30     }31     32 }
 1 package com.xujingyang.Exok; 2  3 /** 4  * 生产商类 5  * @author 徐景洋 6  */ 7 public class Producer implements Runnable { 8     private Goods goods; 9 10     public Goods getGoods() {11         return goods;12     }13 14     public void setGoods(Goods goods) {15         this.goods = goods;16     }17 18     @Override19     public void run() {20         for (int i = 0; i < 5; i++) {21             synchronized (goods) {22                 if(goods.getNum()>0){23                     try {24                         goods.wait();//商品数量已经大于0啦,消费者要取货咯,自己就开始等待咯25                     } catch (InterruptedException e) {26                         e.printStackTrace();27                     }28                 }29                 30                 if (i % 2 == 0) {31                     goods.setPinpai("哇哈哈");32                     try {33                         Thread.sleep(10);34                     } catch (InterruptedException e) {35                         e.printStackTrace();36                     }37                     goods.setName("矿泉水");38 39                 } else {40                     goods.setPinpai("旺仔");41                     try {42                         Thread.sleep(10);43                     } catch (InterruptedException e) {44                         e.printStackTrace();45                     }46                     goods.setName("小馒头");47                 }48                 goods.setNum((goods.getNum()+1));49                 System.out.println("生产了" + goods.getPinpai() + goods.getName());50                 goods.notify();//商品不够啦,自己生产完,然后通知消费者取货咯51             }52         }53     }54 55 }
 1 package com.xujingyang.Exok; 2  3 /** 4  * 消费者类 5  * @author 徐景洋 6  */ 7 public class Customer implements Runnable { 8  9     private Goods goods;10 11     public Goods getGoods() {12         return goods;13     }14 15     public void setGoods(Goods goods) {16         this.goods = goods;17     }18 19     @Override20     public void run() {21         for (int i = 0; i < 5; i++) {22             synchronized (goods) {23                 if(goods.getNum()<=0){24                     try {//如果商品生产的数量小于0,则开始等待.只有有货才能购物嘛25                         goods.wait();26                     } catch (InterruptedException e) {27                         e.printStackTrace();28                     }29                 }30                 31                 try {32                     Thread.sleep(10);33                 } catch (InterruptedException e) {34                     e.printStackTrace();35                 }36                 goods.setNum((goods.getNum()-1));37                 System.out.println("取走了" + goods.getPinpai() + goods.getName());38                 goods.notify();//取走之后通知生产商继续生产商品(唤醒在对象锁等待池中的线程继续执行)39             }40         }41     }42 43 }
 1 package com.xujingyang.Exok; 2  3 /** 4  * 测试类 5  * @author 徐景洋 6  */ 7 public class Test { 8     public static void main(String[] args) { 9         Goods goods=new Goods();10         11         //生产者生产商品12         Producer p=new Producer();13         p.setGoods(goods);14         15         //消费者取走商品16         Customer c=new Customer();17         c.setGoods(goods);18         19         new Thread(p).start();20         new Thread(c).start();21     }22 }

清晰明了不,嘿嘿

原创粉丝点击