ArrayBlockingQueue
ArrayBlockingQueue: 基于数组的阻塞队列实现,在 ArrayBlockingQueue内维护了一个定长数组,以便缓存队列中的数据对象其内部没实现读写分离,ArrayBlockingQueue则读写共享一个锁,意味着生产和消费不能完全并行,长度是需要定义的,
可以指定先进先出或者先进后出,也叫有界队列,在很多场合非常适合适用。
增加值的方法:
add(): 在不超出队列长度的情况下插入元素,可以立即执行,成功返回true,如果队列满了就抛出异常,其底层实现的是offer方法,不会阻塞。
offer(): 在不超出队列长度的情况下插入元素的时候则可以立即在队列的尾部插入指定元素,成功时返回true,如果此队列已满,则返回false。不会阻塞。
put(): 插入元素的时候,如果队列满了就进行等待,直到队列可用。
取值的方法:
remove():底层是用到了poll()方法,检索并且删除返回队列头的元素,与poll()方法不同的是,元素没有是进行抛异常NoSuchElementException。
poll(): 检索并且删除返回队列头的元素,有就返回没有就返回null。
take(): 检索并且删除返回队列头的元素,如果元素没有会一直等待,有就返回。
peek(): 检索但不移除此队列的头部;如果此队列为空,则返回null。返回头部元素。
LinkedBlockingQueue
offer(E e): 将给定的元素设置到队列中,如果设置成功返回true, 否则返回false. e的值不能为空,否则抛出空指针异常。
offer(E e, long timeout, TimeUnit unit): 将给定元素在给定的时间内设置到队列中,如果设置成功返回true, 否则返回false.
add(E e): 将给定元素设置到队列中,如果设置成功返回true, 否则抛出异常。如果是往限定了长度的队列中设置值,推荐使用offer()方法。
put(E e): 将元素设置到队列中,如果队列中没有多余的空间,该方法会一直阻塞,直到队列中有多余的空间。
take(): 从队列中获取值,如果队列中没有值,线程会一直阻塞,直到队列中有值,并且该方法取得了该值。
poll(long timeout, TimeUnit unit): 在给定的时间里,从队列中获取值,如果没有取到会抛出异常。
remainingCapacity():获取队列中剩余的空间。
remove(Object o): 从队列中移除指定的值。
contains(Object o): 判断队列中是否拥有该值。
drainTo(Collection c): 将队列中值,全部移除,并发设置到给定的集合中。