java中的阻塞队列
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
49资源网 » java中的阻塞队列