BlockingQueue就是阻塞队列。在某些情况下对阻塞队列的访问可能会造成阻塞。
会产生阻塞的情况有以下两种:
- 当队列满之后,进行入队操作;
- 当队列空之后,进行出队操作;
因此,当一个线程对一个队列已满的情况下进行入队操作就会产生阻塞,除非有另一个线程进行出队列操作。同样当一个线程对一个空队列进行出队操作时也会被阻塞,除非有另一个线程进行入队操作。
根据上面的特性可以知道,阻塞队列是线程安全的。通常用在生产者消费者场景。
实现类 ArrayBlockingQueue
ArrayBlockingQueue是一个有界的阻塞队列(容量有限),内部使用数组实现,以先进先出的方式存储数据
实现类DelayQueue
DelayQueue阻塞的是内部元素,DelayQueue中的元素必须实现一个接口,是J.U.C中的Delay接口(继承了Comparable接口)。DelayQueue中的元素需要进行排序。一般情况下按照元素过期时间的优先级进行排序。
DelayQueue的使用场景:定时关闭连接、缓存对象、超时处理等。
实现类LinkedBlockingQueue
LinkedBlockingQueue的大小和配置是可选的,如果初始化时指定了一个大小,那么就是有边界的;如果不指定大小,那么就是无边界的(默认最大整型值,内部实现是一个链表)。也是以先进先出的方式存储数据。
实现类PriorityBlockingQueue
这是一个带优先级的阻塞队列,同时也是一个无边界的队列,但是有排序规则的。需要注意的是PriorityBlockingQueue是允许插入null(空对象)的。插入PriorityBlockingQueue的对象必须实现comparable接口,队列优先级的排序规则就是按照对接口实现来定义的。
实现类SynchronousQueue
内部仅允许容纳一个元素,当一个线程插入一个元素后就会被阻塞,除非元素被另一个线程消费。因此又称之为同步队列。是一个无界非缓存的队列,准确的说他不存储元素,只有等待元素取走之后才能放入。