欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

阻塞队列和阻塞栈

程序员文章站 2022-04-13 17:01:15
...

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