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


    废话不多说,案例如下

     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     @Override
    19     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     @Override
    20     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 }

    清晰明了不,嘿嘿

  • 相关阅读:
    Instagram/IGListKit 实践谈(UICollectionView框架)
    谈UIView Animation编程艺术
    Swift Protobuf 初探 —— 继 XML 后,JSON 也要被淘汰了吗
    APP缓存数据线程安全问题
    玩转UICollectionViewLayout
    iOS常用宏 定义
    性能优化之NSDateFormatter
    iOS 用自签名证书实现 HTTPS 请求的原理
    iOS开发调试Reveal使用
    iOS配置SSO授权
  • 原文地址:https://www.cnblogs.com/xujingyang/p/6572966.html
Copyright © 2020-2023  润新知