生产者消费者模式案例

该例子利用多线程实现生产者消费者模型。

两个线程:

  • 生产者;
  • 消费者。

实现的功能:

  • 生产者生产满,通知消费者去消费;
  • 仓库没有产品,通知生产者去生产。

为了使代码可读性强,清晰易懂,楼主建了四个Java类:

1.EventStorage:仓储模型,用于定义生产和消费的方法;

2.Producer:生产者;

3.Consumer:消费者;

4.TestThread:用于测试。

 1 /**
 2  * 仓储模型
 3  */
 4 public class EventStorage {
 5     
 6     //用于打印时间
 7     private List<Date> storage;
 8     
 9     //最大生产数量
10     private int maxSize;
11     
12     public EventStorage() {
13         
14         maxSize = 10;
15         storage = new LinkedList<Date>();
16     }
17     
18     //模拟生产动作
19     public synchronized void set() {
20         while (storage.size() == maxSize) {
21             try {
22                 wait();//如果生产满,通知生产者等待
23             } catch (InterruptedException e) {
24                 e.printStackTrace();
25             }
26         }
27         
28         storage.add(new Date());
29         System.out.println("生产: "+ storage.size());
30         notifyAll();//唤醒在等待操作资源的线程(队列)
31     }
32     
33     //模拟消费动作
34     public synchronized void get() {
35         while (storage.size() == 0) {
36             try {
37                 wait();//如果为空,通知消费者等待
38             } catch (InterruptedException e) {
39                 e.printStackTrace();
40             }
41         }
42         
43         System.out.println("剩余: "+ storage.size()+ ",Time: " +((LinkedList<?>)storage).poll());  
44         notifyAll();//唤醒在等待操作资源的线程(队列)  
45     }    
46 }

 

 1 /**
 2  * 生产者
 3  * @author ycchia
 4  *
 5  */
 6 public class Producer implements Runnable {
 7     
 8     //仓储模型
 9     private EventStorage storage;
10 
11     //构造函数
12     public Producer(EventStorage storage) {
13         this.storage = storage;
14     }
15 
16     @Override
17     public void run() {
18         for (int i = 0; i < 100; i++) {
19             //调用生产方法
20             storage.set();
21         }
22     }
23 }
 1 /**
 2  * 消费者
 3  * @author ycchia
 4  *
 5  */
 6 public class Consumer implements Runnable {
 7 
 8     //仓储模型
 9     private EventStorage storage;
10     
11     //构造函数
12     public Consumer(EventStorage storage) {
13         this.storage = storage;
14     }
15     
16     @Override
17     public void run() {
18         for (int i = 0; i < 100; i++) {
19             //调用消费方法
20             storage.get();
21         }
22     }
23 }
 1 public class TestThread {
 2 
 3     public static void main(String[] args) {
 4         
 5         EventStorage storage = new EventStorage();
 6         Producer producer = new Producer(storage);
 7         //生产者线程
 8         Thread t1 = new Thread(producer);
 9         Consumer consumer = new Consumer(storage);
10         //消费者线程
11         Thread t2 = new Thread(consumer);
12 
13         //启动线程
14         t2.start();
15         t1.start();
16     }
17 }

启动程序,console信息如下:

完美实现多线程同步。快去试一下吧!

posted @ 2017-07-17 18:10  梦里南柯  阅读(1720)  评论(1编辑  收藏  举报