Concurrent包是jdk5中开始提供的一套并发编程包,其中包含了大量和多线程开发相关的工具类,大大的简化了java的多线程开发,在高并发 分布式场景下应用广泛。本文主要介绍BlockingQueue阻塞队列。
概述
java.util.concurrent 包里的 BlockingQueue 接口表示一个线程安放入和提取实例的队列。
特点:
BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。下图是对这个原理的阐述:
一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue。
一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。
也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对象。
负责消费的线程将会一直从该阻塞队列中拿出对象。直到消费线程尝试去从一个空的队列中取走对象。
继承结构
java.util.concurrent
接口 BlockingQueue<E>
|-
java.util.concurrent
类 ArrayBlockingQueue<E>
|-
java.util.concurrent
类 LinkedBlockingQueue<E>
常用的api
BlockingQueue 具有 4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果
请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:
四组不同的行为方式解释:
1. 抛异常:如果试图的操作无法立即执行,抛一个异常。
2. 特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
3. 阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。
4. 超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是 true / false)。
无法向一个 BlockingQueue 中插入 null。如果你试图插入 null, BlockingQueue 将会抛出NullPointerException。
(我是一个转行过来的java初学者,望各位看官发现文章 中的错误还望指正。走过路过点个赞支持一下呗。)