Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1604333
  • 博文数量: 695
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 4027
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 21:22
文章分类

全部博文(695)

文章存档

2018年(18)

2017年(74)

2016年(170)

2015年(102)

2014年(276)

2013年(55)

分类: Java

2017-08-15 11:19:27


点击(此处)折叠或打开

  1. package com.subject01;
  2.  
  3. import java.util.PriorityQueue;
  4.  
  5. /**
  6.  * 通过wait和notify 实现
  7.  * 生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,
  8.  * 生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,
  9.  * 那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。
  10.  * 因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。
  11.  * 然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。
  12.  * 同样地,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种互相通信的过程就是线程间的协作。
  13.  * com.subject01.CusAndPro.java
  14.  * @author 孙涛
  15.  * 2016年5月10日
  16.  */
  17. public class CusAndPro {
  18.  
  19.     private int queueSize = 10 ;
  20.     private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
  21.      
  22.     public static void main(String[] args) {
  23.         CusAndPro cap = new CusAndPro();
  24.         Consumer cus = cap.new Consumer();
  25.         Producer pro = cap.new Producer();
  26.         Thread cusT = new Thread(cus);
  27.         Thread proT = new Thread(pro);
  28.          
  29.         proT.start();
  30.         cusT.start();
  31.     }
  32.     /**
  33.      * 消费者
  34.      * com.subject01.CusAndPro.java
  35.      * @author 孙涛
  36.      * 2016年5月10日
  37.      */
  38.     class Consumer implements Runnable{
  39.  
  40.         @Override
  41.         public void run() {
  42.             cousume();
  43.         }
  44.  
  45.         private void cousume() {
  46.             while(true){
  47.                 synchronized (queue) {
  48.                     while(queue.size() ==0){//这里注意一定while循环判断了,生产者和消费者都使用一个queue wait、notify,当生产者被另一个生
  49.                                                                   //  产者唤醒时,经过while判断size还是0,继续wait。当然会影响性能可以使用ReentrantLock的condition
  50.      // private final Lock lock = new ReentrantLock(); private Condition notFull = lock.newCondition();   rivate Condition notEmpty = lock.newCondition()
  51.                                                                    //   这样生成多个条件 以上是Condition接口定义的方法,await*对应于Object.waitsignal对应于Object.notifysignalAll对应于Object.notifyAll
  52.                         try {
  53.                             System.out.println("队列空,等待数据。。。");
  54.                             queue.wait();
  55.                         } catch (InterruptedException e) {
  56.                             e.printStackTrace();
  57.                             queue.notify();
  58.                         }
  59.                     }
  60.                      
  61.                     queue.poll() ;
  62.                     queue.notify();
  63.                     System.out.println("从队列中取走一个元素,队列中剩余"+queue.size()+"个");
  64.                 }
  65.             }
  66.         }
  67.          
  68.     }
  69.     /**
  70.      * 生产者
  71.      * com.subject01.CusAndPro.java
  72.      * @author 孙涛
  73.      * 2016年5月10日
  74.      */
  75.     class Producer implements Runnable{
  76.  
  77.         @Override
  78.         public void run() {
  79.             produce();
  80.         }
  81.  
  82.         private void produce() {
  83.             while(true){
  84.                 synchronized(queue){
  85.                     while(queue.size() == queueSize){
  86.                         try {
  87.                             System.out.println("队列已满,等待空余的空间");
  88.                             queue.wait();
  89.                         } catch (InterruptedException e) {
  90.                             e.printStackTrace();
  91.                             queue.notify();
  92.                         }
  93.                     }
  94.                      
  95.                     queue.offer(1); // 每次插入一个元素
  96.                     queue.notify();
  97.                     System.out.println("向队列取中插入一个元素,队列剩余空间:"+(queueSize-queue.size()));
  98.                 }
  99.             }
  100.         }
  101.          
  102.     }
  103. }

http://blog.csdn.net/vernonzheng/article/details/8288251
http://www.cnblogs.com/xiaotao726/p/5476644.html
阅读(777) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~