应用Lock来实现临盆者和花费者题目   
               添加时间:2013-5-18 点击量: 
 
              
  1 package com.thread;
  2 
  3 import java.util.LinkedList;
  4 import java.util.concurrent.locks.Condition;
  5 import java.util.concurrent.locks.Lock;
  6 import java.util.concurrent.locks.ReentrantLock;
  7 
  8 
  9 /
 10   应用Lock来实现临盆者和花费者题目
 11   
 12   @author 刘玲
 13  
 14  /
 15 public class ProducerConsumer {
 16     public static void main(String[] args) {
 17         Basket b = new Basket();
 18         Product p = new Product(b);
 19         Consumer c = new Consumer(b);
 20         Consumer c1 = new Consumer(b);
 21         new Thread(p).start();
 22         new Thread(c).start();
 23         new Thread(c1).start();
 24     }
 25 }
 26 //馒头
 27 class ManTou{
 28     int id;
 29     public ManTou(int id) {
 30         this.id = id;
 31     }
 32     @Override
 33     public String toString() {
 34         return ManTou+id;
 35     }
 36 }
 37 
 38 //装馒头的篮子
 39 class Basket{
 40     int max = 6;
 41     LinkedList<ManTou> manTous = new LinkedList<ManTou>();
 42     Lock lock = new ReentrantLock(); //锁对象
 43     Condition full = lock.newCondition();  //用来监控篮子是否满的Condition实例
 44     Condition empty = lock.newCondition(); //用来监控篮子是否空的Condition实例
 45     //往篮子里面放馒头
 46     public void push(ManTou m){
 47         lock.lock();
 48         try {
 49             while(max == manTous.size()){
 50                 System.out.println(篮子是满的,待会儿再临盆...);
 51                 full.await();
 52             }
 53             manTous.add(m);
 54             empty.signal();
 55         } catch (InterruptedException e) {
 56             e.printStackTrace();
 57         }finally{
 58             lock.unlock();
 59         }
 60     }
 61     //往篮子里面取馒头
 62     public ManTou pop(){
 63         ManTou m = null;
 64         lock.lock();
 65         try {
 66             while(manTous.size() == 0){
 67                 System.out.println(篮子是空的,待会儿再吃...);
 68                 empty.await();
 69             }
 70             m = manTous.removeFirst();
 71             full.signal();
 72         } catch (InterruptedException e) {
 73             e.printStackTrace();
 74         }finally{
 75             lock.unlock();
 76             return m;
 77         }
 78     }
 79 }
 80 //临盆者
 81 class Product implements Runnable{
 82     Basket basket;
 83     public Product(Basket basket) {
 84         this.basket = basket;
 85     }
 86     public void run() {
 87         for (int i = 0; i < 40; i++) {
 88             ManTou m = new ManTou(i);
 89             basket.push(m);
 90             System.out.println(临盆了+m);
 91             try {
 92                 Thread.sleep((int)(Math.random()2000));
 93             } catch (InterruptedException e) {
 94                 e.printStackTrace();
 95             }
 96             
 97         }
 98     }
 99 }
100 
101 //花费者
102 class Consumer implements Runnable{
103     Basket basket;
104     public Consumer(Basket basket) {
105         this.basket = basket;
106     }
107     public void run() {
108         for (int i = 0; i < 20; i++) {
109             try {
110                 Thread.sleep((int)(Math.random()2000));
111             } catch (InterruptedException e) {
112                 e.printStackTrace();
113             }
114             ManTou m = basket.pop();
115             System.out.println(花费了+m);
116         }
117     }
118 }
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
                     
                  
     
  
 
    
    
1 package com.thread;
2
3 import java.util.LinkedList;
4 import java.util.concurrent.locks.Condition;
5 import java.util.concurrent.locks.Lock;
6 import java.util.concurrent.locks.ReentrantLock;
7
8
9 /
10 应用Lock来实现临盆者和花费者题目
11
12 @author 刘玲
13
14 /
15 public class ProducerConsumer {
16 public static void main(String[] args) {
17 Basket b = new Basket();
18 Product p = new Product(b);
19 Consumer c = new Consumer(b);
20 Consumer c1 = new Consumer(b);
21 new Thread(p).start();
22 new Thread(c).start();
23 new Thread(c1).start();
24 }
25 }
26 //馒头
27 class ManTou{
28 int id;
29 public ManTou(int id) {
30 this.id = id;
31 }
32 @Override
33 public String toString() {
34 return ManTou+id;
35 }
36 }
37
38 //装馒头的篮子
39 class Basket{
40 int max = 6;
41 LinkedList<ManTou> manTous = new LinkedList<ManTou>();
42 Lock lock = new ReentrantLock(); //锁对象
43 Condition full = lock.newCondition(); //用来监控篮子是否满的Condition实例
44 Condition empty = lock.newCondition(); //用来监控篮子是否空的Condition实例
45 //往篮子里面放馒头
46 public void push(ManTou m){
47 lock.lock();
48 try {
49 while(max == manTous.size()){
50 System.out.println(篮子是满的,待会儿再临盆...);
51 full.await();
52 }
53 manTous.add(m);
54 empty.signal();
55 } catch (InterruptedException e) {
56 e.printStackTrace();
57 }finally{
58 lock.unlock();
59 }
60 }
61 //往篮子里面取馒头
62 public ManTou pop(){
63 ManTou m = null;
64 lock.lock();
65 try {
66 while(manTous.size() == 0){
67 System.out.println(篮子是空的,待会儿再吃...);
68 empty.await();
69 }
70 m = manTous.removeFirst();
71 full.signal();
72 } catch (InterruptedException e) {
73 e.printStackTrace();
74 }finally{
75 lock.unlock();
76 return m;
77 }
78 }
79 }
80 //临盆者
81 class Product implements Runnable{
82 Basket basket;
83 public Product(Basket basket) {
84 this.basket = basket;
85 }
86 public void run() {
87 for (int i = 0; i < 40; i++) {
88 ManTou m = new ManTou(i);
89 basket.push(m);
90 System.out.println(临盆了+m);
91 try {
92 Thread.sleep((int)(Math.random()2000));
93 } catch (InterruptedException e) {
94 e.printStackTrace();
95 }
96
97 }
98 }
99 }
100
101 //花费者
102 class Consumer implements Runnable{
103 Basket basket;
104 public Consumer(Basket basket) {
105 this.basket = basket;
106 }
107 public void run() {
108 for (int i = 0; i < 20; i++) {
109 try {
110 Thread.sleep((int)(Math.random()2000));
111 } catch (InterruptedException e) {
112 e.printStackTrace();
113 }
114 ManTou m = basket.pop();
115 System.out.println(花费了+m);
116 }
117 }
118 }
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》




