了解 BlockingQueue:
BlockingQueue 位于 java.util.concurrent 中,定义为 public interface BlockingQueue<E> extends Queue<E>。
在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。
理想情况下,如果生产者产出数据的速度大于消费者消费的速度,并且当生产出来的数据累积到一定程度的时候,那么生产者必须暂停等待一下(阻塞生产者线程),以便等待消费者线程把累积的数据处理完毕。
BlockingQueue 的核心方法:
1.放入数据
offer(anObject):表示如果可能的话,将 an Object 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则返回 false.(本方法不阻塞当前执行方法的线程)
offer(E o, long timeout, TimeUnit unit):可以设定等待的时间,如果在指定的时间内,还不能往队列中加入 BlockingQueue ,则返回失败。
put(an Object):把 an Object 加到 BlockingQueue 里,如果 BlockingQueue 没有空间,则调用此方法的线程被阻断直到 BlockingQueue 里面有空间再继续.
2. 获取数据:
poll(time):取走 BlockingQueue 里排在首位的对象,若不能立即取出,则可以等 time 参数规定的时间,取不到时返回null;
poll(long timeout, TimeUnit unit):从 BlockingQueue 取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,则立即返回队列中的数据。否则知道时间超时还没有数据可取,返回失败。
take():取走 BlockingQueue 里排在首位的对象,若BlockingQueue为空,阻塞进入等待状态直到 BlockingQueue 有新的数据被加入;
drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数), 通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。
常见 BlockingQueue
- ArrayBlockingQueue (基于数组的阻塞队列,a fixed-sized array.Once created, the capacity cannot be changed.)
- LinkedBlockingQueue
- DelayQueue (没有大小限制)
DelayQueue 中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素.DelayQueue 是一个没有大小限制的队列,
因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞。 - PriorityBlockingQueue 基于优先级的阻塞队列
- SynchronousQueue