BlockingQueue阻塞队列
BlockingQueue简介
juc包下,BlockingQueue很好的解决了多线程中,高效安全的"传输数据"问题。
阻塞队列,是一个队列,可以是数据从队列的一端输入,从另一端输出。
当队列空时,从队列获取元素线程被阻塞,直到其他线程向空的队列插入新元素。
当队列满时,向队列添加元素线程被阻塞,直到其他线程从队列中移除一个或多个元素或者完全清空,使队列变得空闲起来后新增。
在多线程中,阻塞是指在某些情况下,挂起线程,一旦条件满足,被挂起的线程被自动唤醒。
队列和栈
队列 FIFO(先进先出)
栈 FILO(先进后出)
常用的BlockingQueue子类
ArrayBlockingQueue(常用)
由数组结构组成的有界阻塞队列。
LinkedBlockingQueue(常用)
由链表结构组成的有界(大小默认值为Integer.MAX_VALUE)阻塞队列。
DelayQueue
使用优先级队列实现的延迟无界阻塞队列。
PriorityBlockingQueue
支持优先级排序的无界阻塞队列。
SynchronousQueue
该队列在创建时,有两种模式,公平和非公平。
公平模式会采用公平锁,并使用队列来阻塞多余的生成者和消费者,从而实现整体的公平策略。
非公平模式,采用非公平锁,且使用栈来阻塞多余的生产者和消费者,这种模式下,如果生产者和消费者的处理速度存在差距,则很容易出现饥渴的情况,即可能出现生产不足(消费者在等待生产者),或者生产过剩(有些元素,永远不会被消费)。
总结,不存储元素的同步队列,即存储单个元素的对列。
LinkedBlockingDeque
由链表组成的双休阻塞队列。
BlockingQueue核心方法
方法使用代码
/**
* @author 长名06
* @version 1.0
*/
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3);
//第一组
//add方法无空间可添加元素,抛IllegalStateException("Queue full")异常 有空间可添加元素,返回true
// System.out.println(blockingQueue.add("wind-风"));//
// System.out.println(blockingQueue.add("flower-花"));
// System.out.println(blockingQueue.add("snow-雪"));
// System.out.println(blockingQueue.add("moon-月"));
//System.out.println(blockingQueue.element());
//remove方法,无元素可用,抛NoSuchElementException异常 有元素可用,返回元素
// System.out.println(blockingQueue.remove());
// System.out.println(blockingQueue.remove());
// System.out.println(blockingQueue.remove());
// System.out.println(blockingQueue.remove());
//第二组
//offer(E e)方法 无空间可添加元素,返回false 有空间可用添加元素,返回true
//还存在offer(E e)的重载方法offer(E e, long timeout, TimeUnit unit) 对应第四组
//无空间可添加元素,会等待一段时间,看是否有空间可用添加元素,等待时间内有,添加 没有就返回false
//有空间可用添加元素,返回true
// System.out.println(blockingQueue.offer("wind-风"));
// System.out.println(blockingQueue.offer("flower-花"));
// System.out.println(blockingQueue.offer("snow-雪"));
// System.out.println(blockingQueue.offer("moon-月"));
//
//poll方法,无元素可用,返回null 有元素可用,返回元素
// System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.poll());
// System.out.println(blockingQueue.poll());
//第三组
//put方法注释
//Inserts the specified element into this queue, waiting if necessary for space to become available.
//put方法,如果队列已满,就一直等待,直到队列可用添加元素 put方法无返回值
blockingQueue.put("wind-风");
blockingQueue.put("flower-花");
blockingQueue.put("snow-雪");
System.out.println("队列已满");
System.out.println(blockingQueue.offer("moon-月", 3L, TimeUnit.SECONDS));
// blockingQueue.put("moon-月");
//take方法注释
//Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
//take方法,不为空返回元素 如果队列为空,就一直阻塞,等待队列中有元素可用
// System.out.println(blockingQueue.take());
// System.out.println(blockingQueue.take());
// System.out.println(blockingQueue.take());
// System.out.println("队列已空");
// blockingQueue.take();
//第四组
//poll方法注释
//Retrieves and removes the head of this queue, waiting up to the specified wait time if necessary for an element to become available.
//poll方法,取元素,如果队列不为空,返回元素
// 如果队列为空,会等待一段时间,看是否有元素可用,没有就返回null
System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
// System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
}
}
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。
标签:队列,元素,System,阻塞,println,BlockingQueue,out,blockingQueue From: https://www.cnblogs.com/changming06/p/17857567.html