ArrayBlockingQueue实现生产者消费者模型

原创 2018年04月16日 16:13:01

ArrayBlockingQueue是一个由数组构成的有界阻塞队列,其常用构造方法:

//fair判断是否为公平锁,为true的话表明先进入的线程优先访问数据
 public ArrayBlockingQueue(int capacity, boolean fair) {
        // 初始容量必须大于0
        if (capacity <= 0)
            throw new IllegalArgumentException();
        // 初始化数组
        this.items = new Object[capacity];
        // 初始化可重入锁
        lock = new ReentrantLock(fair);
        // 初始化等待条件
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }
public class ArrayBlockQueueTest {



    /**
     * @param args
     * 基于ArrayBlockQueue实现的生产者消费者模型
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayBlockingQueue<Integer>queue=new ArrayBlockingQueue<>(100, true);
        ArrayBlockQueueTest test=new ArrayBlockQueueTest();
        test.new Produce(queue).start();
        test.new Consumer(queue).start();

    }

    public class Produce extends Thread{

        /**
         * @param queue
         */
        public Produce(ArrayBlockingQueue<Integer> queue) {
            super();
            this.queue = queue;
        }

        private ArrayBlockingQueue<Integer> queue;

        @Override
        public void run(){
            try {
                while (true) {
                    System.out.println("消费端消费"+queue.take());
                }

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }


    } 



    public class Consumer extends Thread{

        /**
         * @param queue
         */
        public Consumer(ArrayBlockingQueue<Integer> queue) {
            super();
            this.queue = queue;
        }

        private ArrayBlockingQueue<Integer> queue;

        @Override
        public void run(){
            int i=0;
            while (i<1000000) {
                System.out.println("添加元素"+i);
                try {
                    queue.put(i++);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }


    } 

}

这里重点关注下ArrayBlockingQueue的put方法和add方法。
put方法是存入元素,如果满的话就休眠线程等待。
add方法最终盗用的是offer方法,offer方法是插入,如果满的话就等待,并返回false。而add方法判断offer返回false后,会报错IllegalStateException。所以在生产消费者模型中用offer或者put,不要用add

   public boolean add(E e) {
        if (offer(e))
            return true;
        else
            throw new IllegalStateException("Queue full");
    }

 1. put函数  

  说明:put函数用于存放元素,在当前线程被中断时会抛出异常,并且当队列已经满时,会阻塞一直等待。其中,put会调用enqueue函数,enqueue函数源码如下

 2. offer函数  

  说明:offer函数也用于存放元素,在调用ArrayBlockingQueue的add方法时,会间接的调用到offer函数,offer函数添加元素不会抛出异常,当底层Object数组已满时,则返回false,否则,会调用enqueue函数,将元素存入底层Object数组。并唤醒等待notEmpty条件的线程。

  3. take函数  
  说明:take函数用于从ArrayBlockingQueue中获取一个元素,其与put函数相对应,在当前线程被中断时会抛出异常,并且当队列为空时,会阻塞一直等待。其中,take会调用dequeue函数,dequeue函数源码如下  

  说明:dequeue函数用于将取元素,并且会唤醒等待notFull条件的线程。

  4. poll函数  

  说明:poll函数用于获取元素,其与offer函数相对应,不会抛出异常,当元素个数为0是,返回null,否则,调用dequeue函数,并唤醒等待notFull条件的线程。并返回。

  5. clear函数  

  说明:clear函数用于清空ArrayBlockingQueue,并且会释放所有等待notFull条件的线程(存放元素的线程)。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Andyzhu_2005/article/details/79962090

生产者消费者模型(二)-引入ArrayBlockingQueue

在《生产者消费者模型你知道多少》中简单的模拟了一个生产者消费者模型。有些网友对我的实现提出了很多质疑。我在文章的结尾也对抛出了一个问题。在代码中也充斥了大量的锁,可能有些锁是不需要的。在今天我将引入A...
  • luohuacanyue
  • luohuacanyue
  • 2013年11月18日 08:00
  • 20177

利用ArrayBlockingQueue实现生产者-消费者

生产者: import java.util.concurrent.BlockingQueue; public class Producer implements Runnable { pr...
  • baidu_34464794
  • baidu_34464794
  • 2017年04月06日 16:20
  • 401

生产者消费者模型 ArrayBlockingQueue

前言                 在《生产者消费者模型你知道多少》中简单的模拟了一个生产者消费者模型。有些网友对我的实现提出了很多质疑。我在文章的结尾也对抛出了一个问题:在添加的过程中可能出...
  • jie980432841
  • jie980432841
  • 2014年08月04日 15:40
  • 329

生产者消费者模型(Linux系统下的两种实现方法)

生产者消费者问题是同步问题中的一种常见情况,借用一下维基百科的话 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer ...
  • yusiguyuan
  • yusiguyuan
  • 2015年09月07日 14:32
  • 3614

简单生产者消费者模型(java实现)

/** * Created by butter on 16-11-16. */ /** * * 生产者与消费者模型中,要保证以下几点: * 1 同一时间内只能有一个生产者生产 ...
  • Dextrad_ihacker
  • Dextrad_ihacker
  • 2016年11月16日 21:24
  • 581

Java实现生产者消费者模型

生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。解决生产者/消费者问题的方法可分为两类:(1)采用某种机制...
  • ILOVESMJ
  • ILOVESMJ
  • 2016年09月19日 17:07
  • 7164

pthread-消费者/生产者模型实现

pthread-消费者/生产者模型实现消费者/生产者模型是多线程编程开发的常用模型,该模型通过平衡生产者线程和消费者线程的工作能力来提高程序整体的数据处理能力。 设计该模型要注意以下几项: - 资...
  • u010090316
  • u010090316
  • 2017年05月02日 23:57
  • 165

13、生产者消费者模型_两种实现方式

wait()、notify()和notifyAll()是Object类中的方法: 1 2 3 4 5 6 7 8 9 ...
  • u010796790
  • u010796790
  • 2016年08月12日 19:20
  • 522

VC的生产者消费者模型

#include #include #include HANDLE empty_Semaphore;//设置信号量用。empty_Semaphore表示空的缓冲池的数量 HANDLE full...
  • u012519333
  • u012519333
  • 2013年12月11日 17:44
  • 622

用链表实现生产者消费者模型

生产者消费者模型:有一群生产者在生产产品,并将这些产品提供给消费者去消费。为使生产者进程和消费者进程能并发执行,在两者之间设置缓冲区,生产者进程将其所生产的产品放入缓冲区中;消费者进程可从缓冲区中取走...
  • jelly_gemini
  • jelly_gemini
  • 2017年06月17日 20:41
  • 315
收藏助手
不良信息举报
您举报文章:ArrayBlockingQueue实现生产者消费者模型
举报原因:
原因补充:

(最多只允许输入30个字)