线程中消费者生产者的实例代码(synchronized关键字)

http://www.cnblogs.com/DreamDrive/p/6204665.html  这个是用Lock类实现的.

场景:

厨师类:

 1 import java.util.List;
 2 import java.util.Random;
 3 import java.util.concurrent.TimeUnit;
 4 
 5 public class Cook implements Runnable {
 6 
 7     private List<Food> foods;
 8     private static int num = 1;
 9     private static final int MAXSIZE = 1;
10 
11     public List<Food> getFoods() {
12         return foods;
13     }
14 
15     public void setFoods(List<Food> foods) {
16         this.foods = foods;
17     }
18 
19     public Cook(List<Food> foods) {
20         this.foods = foods;
21     }
22 
23     public Cook() {
24     }
25 
26     public void produce() {
27         while (true) {
28             synchronized (SaleWindow.class) {
29                 if (foods.size() < MAXSIZE) {//卖饭的桌子上饭总有 一定的容量限制.
30                     Food food = new Food((num++) + "");
31                     foods.add(food);
32                     System.out.println(Thread.currentThread().getName()
33                             + " :做好 " + food.getId() + " 号饭了");
34                     Random ran = new Random();
35                     int i = ran.nextInt(300);
36                     try {
37                         TimeUnit.MILLISECONDS.sleep(i);
38                     } catch (InterruptedException e) {
39                         e.printStackTrace();
40                     }
41                     
42                     //SaleWindow.class.notify();
43                     SaleWindow.class.notifyAll();
44                 } else {
45                     System.out.println(Thread.currentThread().getName()
46                             + " :桌子放满了。窗口赶紧卖,我休息了。。。");
47 
48                     try {
49                         SaleWindow.class.wait();
50                     } catch (InterruptedException e) {
51                         e.printStackTrace();
52                     }
53                 }
54             }
55         }
56     }
57 
58     @Override
59     public void run() {
60         produce();
61     }
62 }

 食物类:

 1 public class Food {
 2 
 3     private String id;
 4 
 5     
 6     public Food(String id) {
 7         this.id = id;
 8     }
 9 
10     public String getId() {
11         return id;
12     }
13 
14     public void setId(String id) {
15         this.id = id;
16     }
17     
18     
19 }

 卖饭窗口类:

 1 import java.util.List;
 2 import java.util.Random;
 3 import java.util.concurrent.TimeUnit;
 4 
 5 public class SaleWindow implements Runnable {
 6 
 7     private List<Food> foods;
 8 
 9     public List<Food> getFoods() {
10         return foods;
11     }
12 
13     public void setFoods(List<Food> foods) {
14         this.foods = foods;
15     }
16 
17     public SaleWindow(List<Food> foods) {
18         this.foods = foods;
19     }
20 
21     public SaleWindow() {
22     }
23 
24     public  void sale() {
25         while (true) {
26             synchronized (SaleWindow.class) {
27                 if (foods.size() > 0) {
28                     try {
29                         Food food = foods.get(0);
30                         System.out.println(Thread.currentThread().getName()
31                                 + ": 卖出了 " + food.getId() + " 号饭...");
32                         Random ran = new Random();
33                         int i = ran.nextInt(300);
34 
35                         TimeUnit.MILLISECONDS.sleep(i);
36                         foods.remove(0);
37                         //SaleWindow.class.notify();//随机唤醒一条等待的线程
38                         SaleWindow.class.notifyAll();//唤醒所有等待的线程
39                     } catch (InterruptedException e) {
40                         e.printStackTrace();
41                     }
42                 }else{
43                     System.out.println(Thread.currentThread().getName()+":饭买完了。厨师赶紧做,我休息了。。。");
44                     try {
45                         SaleWindow.class.wait();
46                     } catch (InterruptedException e) {
47                         e.printStackTrace();
48                     }
49                     
50                 }
51             }
52         }
53     }
54 
55     @Override
56     public void run() {
57         sale();
58     }
59 
60 }

 测试类:

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 
 4 public class Test {
 5 
 6     public static void main(String[] args) {
 7 
 8         List<Food> foods = new ArrayList<Food>();
 9         for (int i = 0; i < 4; i++) {//4个厨师 生产
10             new Thread(new Cook(foods),"Cook"+(i+1)).start();
11         }
12         for (int i = 0; i < 3; i++) {//3个窗口 消费
13             new Thread(new SaleWindow(foods),"sale"+(i+1)).start();
14         }
15     }
16 }
原文地址:https://www.cnblogs.com/DreamDrive/p/6192685.html