阻塞队列
阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBlockingQueue,它实现了一个有界队列,当队列满时,便会阻塞等待,直到有元素出队,后续的元素才可以被加入队列
package test; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class BlockingQueueTest { @SuppressWarnings("unchecked") public static void main(String[] args) throws InterruptedException { BlockingQueue bqueue = new ArrayBlockingQueue(10); for (int i = 1; i < 30; i++) { bqueue.put(i); System.out.println("阻塞队列添加元素:" + i); } System.out.println("----程序结束----"); } }
输出到元素19时候,就一直处于等待状态。这里没有用多线程来演示,没有这个必要
阻塞队列提供了四种处理方法:
方法\处理方式 | 抛出异常 | 返回特殊值 | 一直阻塞 | 超时退出 |
插入方法 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移除方法 | remove() | poll() | take() | poll(time,unit) |
检查方法 | element() | peek() | 不可用 | 不可用 |
抛出异常:是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue full”)异常。当队列为空时,从队列里获取元素时会抛出NoSuchElementException异常 。
返回特殊值:插入方法会返回是否成功,成功则返回true。移除方法,则是从队列里拿出一个元素,如果没有则返回null
一直阻塞:当阻塞队列满时,如果生产者线程往队列里put元素,队列会一直阻塞生产者线程,直到拿到数据,或者响应中断退出。当队列空时,消费者线程试图从队列里take元素,队列也会阻塞消费者线程,直到队列可用。
超时退出:当阻塞队列满时,队列会阻塞生产者线程一段时间,如果超过一定的时间,生产者线程就会退出。
JDK6提供了6个阻塞队列:
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue
阻塞栈
阻塞栈与阻塞队列相似,只是它是Java 6中加入的新特性,阻塞栈的接口java.util.concurrent.BlockingDeque也有很多实现类,使用方法也比较相似
package test; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; // 注意使用JDK6 public class BlockingDequeTest { @SuppressWarnings("unchecked") public static void main(String[] args) { BlockingDeque deque = new LinkedBlockingDeque(10); for (int i = 0; i < 30; i++) { try { //deque.addFirst(i); // 使用addFirst满时报错 deque.putFirst(i); //deque.addLast(i); // 向尾部增加 //deque.putLast(i); } catch (Exception e) { e.printStackTrace(); } System.out.println("阻塞栈添加元素:" + i); } System.out.println("----程序结束----"); } }
效果是一致的,只是我们看到的是栈的特性!
请您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/ !
自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!
相关推荐
Java并发编程(21)并发新特性—阻塞队列和阻塞栈(含代码)编程开发技术共8页.pdf.zip
java中,常用的阻塞式队列Demo。包含:ArrayBlockingQueue、LinkedQueue、PriorityBlockingQueue
支持多线程的阻塞队列,使用模板技术,可存储任意类型数据
实现java模拟阻塞队列的例子,该代码包括,阻塞队列实现生产者,消费者。和模拟阻塞队列实现生产者及消费者模式,帮助你更好的理解java多线程
并发-线程池和阻塞队列 并发-线程池和阻塞队列 并发-线程池和阻塞队列
讲述线程池原理,线程池使用场景和注意事项,手动创建线程池方法,注意事项,阻塞队列的相关知识
Java实现简单的阻塞队列2种方式,1使用wait(),notify();2使用countdownlatch实现
14-阻塞队列BlockingQueue实战及其原理分析二.pdf
我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题是:它不会对...
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
主要介绍了剖析Java中阻塞队列的实现原理及应用场景,这里也对阻塞和非阻塞队列的不同之处进行了对比,需要的朋友可以参考下
阻塞队列详解
c_c++阻塞队列的代码
c++11 实现的阻塞队列
阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。 考虑下,这样一个多线程模型,程序有一个...
10、阻塞队列BlockingQueue实战及其原理分析_
day19_阻塞队列、线程池、File类、递归.pdf
java阻塞队列实现原理及实例解析.docx
java阻塞队列(Blocking Queue)是一个支持两个附加操作的队列.txt
主要介绍了详解Java阻塞队列(BlockingQueue)的实现原理,阻塞队列是Java util.concurrent包下重要的数据结构,有兴趣的可以了解一下