JAVA多线程之阻塞队列

什么是阻塞队列?

多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享。阻塞队列相当于一个缓冲区,生产者和消费者可以经过它来通信。那到底是怎样进行阻塞的?
阻塞添加:当队列满的时候,队列会阻塞插入元素的线程,直至队列不满
阻塞移除:在队列为空时,队列会阻塞移除元素的线程,直至队列不满

队列的常用方法

在这里插入图片描述
抛出异常
Add: 如果队列的容量已满,在添加元素就会抛出Queue full异常
Remove: 如果队列没有元素,则抛出NoSuchElement异常;如果是删除某一个元素,如果元素不存在,则不会抛出异常,而是返回false.
Element: 如果队列为空,则抛出NoSuchElement异常;如果队不为空,则返回第一个元素。

返回特殊值
offer: 如果可能的话,将元素添加到队列,返回true,如果队列已满,则不添加,返回false.不阻塞执行线程
poll: 从队列返回第一个元素,如果没有返回null.
peek: 从队列返回第一个元素,如果没有返回null
Block Queue

一直阻塞
put:把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里面有空间再继续.
take: 如果取到则返回,如果没有取到,则一直阻塞,直到队列不为空

超时退出
offer(E o, long timeout, TimeUnit unit):可以设定等待的时间,如果在指定的时间内,还不能往队列。加入BlockingQueue,则返回失败。
poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null

常见的阻塞队列

ArrayBlockingQueue
是一个基于数组实现的有界队列,此队列取元素基于先进出,它有区别为公平和非公平访问队列。所谓公平是指,处于阻塞的队列,按照阻塞的先后顺序访问队列;不公平是指被阻塞的线程都可以争夺访问队列的资格。默认是不公平的,如果需要保证公平,则需要通过参数指定。

LinkedBlockingQueue
LinkedBlockingQueue 是一个基于链表实现的有界阻塞队列。默认长度为Integer.MAX_VALUE。也是按照先进先出的原则取元素。LinkedBlockingQueue内部有一个Node类,表示结点,用于存放元素。

PriorityBlockingQueue
是一个支持优先级的无界阻塞队列。基于堆这种数据结构。
它可以对元素进行排序。我们可以指定一个实现了Comparator的比较器。

发布了78 篇原创文章 · 获赞 5 · 访问量 3300
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览