当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

阻塞队列和阻塞栈

发表于: 2014-02-19   作者:cuisuqiang   来源:转载   浏览次数:
摘要: 阻塞队列阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBloc

阻塞队列
阻塞队列是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同步!

阻塞队列和阻塞栈

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
在日常事务中,我们常常依次做如下操作: 排队取得一个单号; 根据这个单号享有一个操作; 为当前的这
前言: 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的
Q.怎么去实现使用独立的进程去生成奇偶数,然后另一个线程打印出奇偶数之和? A.可以通过多线程以及
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是
Java阻塞队列_BlockingQueue 以上是BlockingQueue所有的方法。。 add(anObject):把anObject加到Blo
阻塞队列:只是队列的拓展,传统队列当满的时候会抛出异常,而阻塞队列会一直等待,不会报错,当然
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满
一个指定目录下包含某个关键字的文件,输出文件路径及行号。 同时启动两组线程,一个向队列中添加文
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号