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

 

 

 

 

1.本站所有资源收集于互联网,仅用于学习和研究,若用于违法,与本站无关,仅限学习交流请勿用于商业用途。 2.会员在本站下载的VIP素材后,只拥有使用权,著作权归原作者及49资源网所有。 3.VIP素材,未经合法授权,会员不得以任何形式发布、传播、复制、转售该素材,否则一律封号处理。 4.如果素材损害你的权益,请联系客服删除。
49资源网 » java中的阻塞队列

发表评论