jdk1.5 中阻塞队列的操作:
方法名 | 说明 | 注意 |
---|---|---|
add | 增加一个元索 | 如果队列已满,则抛出一个 IIIegaISlabEepeplian 异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个 NoSuchElementException 异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个 NoSuchElementException 异常 |
offer | 添加一个元素并返回 true | 如果队列已满,则返回 false |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回 null |
peek | 返回队列头部的元素 | 如果队列为空,则返回 null |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
注:
①remove、element、offer、poll、peek 其实是属于 Queue 接口。
②poll 和 peek 方法出错进返回 null。因此,向队列中插入 null 值是不合法的。
③合理利用队列阻塞,可以减少 cpu 使用率(无限循环的时候),put 方法在队列满时阻塞,take 方法在队列空时阻塞
juc 中的阻塞队列的 4 个实现类:
LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue、DelayQueue
LinkedBlockingQueue
LinkedBlockingQueue 的容量在不指定的情况下为 Integer.MAX_VALUE,它是基于链表的队列,此队列按 FIFO(先进先出)排序元素,是线程安全的。
ArrayBlockingQueue
ArrayBlockingQueue 在构造时需要指定容量(数组必须指定大小),并可以选择是否需要公平性,如果公平参数被设置为 true,等待时间最长的线程会优先得到处理(其实就是通过将 ReentrantLock 设置为 true 来达到这种公平性:即等待时间最长的线程会先操作)。它是基于数组的阻塞循环队列,此队列按 FIFO(先进先出)原则对元素进行排序。
PriorityBlockingQueue
PriorityBlockingQueue 是一个带优先级的 队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限,PriorityBlockingQueue 是对 PriorityQueue 的再次包装,是基于堆数据结构的,而 PriorityQueue 是没有容量限制的,与 ArrayList 一样,所以在优先阻塞 队列上 put 时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError,但是如果队列为空,那么取元素的操作 take 就会阻塞。另外,插入该队列中的元 素要具有比较能力。
DelayQueue
DelayQueue(基于 PriorityQueue 来实现的)是一个存放 Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll 就以移除这个元素了。此队列不允许使用 null 元素。
原文地址:https://blog.csdn.net/u013249965/article/details/52595708?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control