多線程 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 }

清晰明了不,嘿嘿


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM