阻塞队列初级篇

队列分为阻塞队列,无阻塞队列。这篇文章先认识一下阻塞队列。

什么是阻塞队列队列??阻塞比作一个池子,如果队列满了,那么往队列里添加元素的线程就会阻塞。如果队列为空,从队列里获取元素的线程就会阻塞。

队列都是Queue的子类,阻塞队列都是BlockingQueue的子类。

下面介绍一下,每一种BlockingQueue的简单使用。

ArrayBlockingQueue,是一个基于数组的阻塞、有界队列。

  1. 使用:
    1. ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);  必须传递初始容量。
    2. put()、add()、offer()都可以添加元素
    3. peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。
    4. 因为它是个有界队列,所以如果添加超出容量的元素,会抛出异常:java.lang.IllegalStateException: Queue full

 

LinkedBlockingQueue,是一个基于列表的阻塞、无界队列。

  1. 使用:
    1. LinkedBlockingQueue link = new LinkedBlockingQueue();它是一个无界队列。
    2. put()、add()、offer()都可以添加元素,不允许添加null
    3. peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。

SynchronousQueue,是一个不存储元素的阻塞队列,可以看成是一个传球手,负责把生产者线程处理的数据直接传递给消费者线程。

  1. 使用:
    1. SynchronousQueue queue = new SynchronousQueue();
    2. 如果像这样:queue.add("baiweijing");直接添加元素会抛出异常。
    3. peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。

 

PriorityBlockingQueue,基于优先级的阻塞、无界队列

  1. 使用:
    1. PriorityBlockingQueue queue = new PriorityBlockingQueue();
    2. add()、put()、offer(),即添加之后queue仍然是无序的。
    3. iter()的结果也是无序的
    4. peek()、poll()、take()可以取出元素,peek()不会删除元素,后面两个会删除元素。而且是按照顺序取出。

DelayQueue

阻塞队列具体会应用在哪?目前还不了解。持续了解中,持续更新中。。。。

发布了39 篇原创文章 · 获赞 12 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/yanweijie0317/article/details/103998709