Queue与BlockingQueue

一、Queue

1.队列继承 Collection
2.队列的介绍

  设计用于在处理之前保存元素的集合,除了基本的Collection操作之外,队列还提供额外的插入,提取和检查操作。
  这些方法的每一种都有两种形式:如果操作失败,则抛出一个异常;另一种返回一个特殊值( null或false ,具体取决于操作)。 
  后一种插入操作专门设计用于容量限制的Queue实现; 在大多数实现中,插入操作不能失败。
  队列通常但不一定是以FIFO(先进先出)方式排序元素。除了优先级队列之外,
  根据提供的比较器对元素进行排序,决定使用自然排序还是LIFO(后进先出)进行排序的LIFO队列(或堆栈)。 
  无论使用什么顺序,队列的头都是通过调用remove()或poll()删除。在一个FIFO队列,所有新元素插入到队列的尾部。
  其他类型的队列可以使用不同的布局规则。每个Queue实现必须指定其排序属性。 
Queue接口没有定义阻塞队列方法 ,阻塞队列在并发编程中是常见的。
wait for elements to appear或space to become available的方法在BlockingQueue接口中定义,该接口扩展了此接口**
  尽管一些实现(例如LinkedList )不禁止插入null, Queue的实现通常不允许插入null元素。
即使实现允许插入null, 但是不应该在Queue插入null ,因为null被poll方法用作特殊的返回值(当队列为空时,poll()返回null,容易混淆)。
Queue的实现通常不定义基于元素的方法equals和hashCode,而是使用Object继承的版本,
因为基于元素的等式无法很好地定义了具有相同元素但不同的排序属性的队列。

3.队列的方法

offer() 与 add() :添加元素
offer方法设计用于在故障是正常的情况下,而不是发生异常的情况,例如在固定容量(“有界”)队列中
区别:
	offer 添加元素失败返回false,offer方法优于add方法
	add 添加元素失败抛出unchecked exception
remove() 与 poll() : 删除并返回队列头。
删除队列头元素是队列排序策略的一个功能,它与实现不同。
区别:
	当队列为空时,poll() 返回null,remove() 抛异常
element()和peek()方法返回队列头元素,但不会删除头元素。
区别 : 如果此队列为空,和peek() 返回 null, element() 将抛出异常。

二、BlockingQueue 阻塞队列

1.BlockingQueue 继承 Queue
2.BlockingQueue 的特点

i.与Queue相比多了
  在检索元素时,队列为空,可以等待对列为非空时再检索;在存储元素时,队列已满,可以等待队列中的空间可用时再存储。
ii.BlockingQueue方法有四种形式,在操作时具有不同的方式,就算不会立刻满足,但是可能在未来的某个时间点满足:
	一个抛异常;第二个返回特殊的值(null 或false);第三个无限期的阻塞线程直到操作成功;第四个阻塞线程直到超过最大时间。
iii.不接受null元素:其实现类的方法add、put或offer使用null值会抛出NullPointerException。
iv.容量有限:在任何给定的时间它可能有一个剩余容量,超过剩余容量添加元素会导致阻塞。没有任何内在容量限制的 BlockingQueue的剩余容量为Integer.MAX_VALUE。
v.BlockingQueue实现类被设计为主要用于生产者 - 消费者队列,但另外支持Collection接口。 
   例如,可以使用remove(x)从队列中删除任意元素。然而,这样的操作通常不能非常有效地执行,并且仅用于偶尔使用,例如当排队的消息被取消时。
vi.BlockingQueue实现是线程安全的。所有队列方法使用内部锁或其他形式的并发控制实现并发效果。然而,大多数的Collection操作addAll、containsAll、retainAll和removeAll 不一定是原子性的除非在其实现方法中特别规定。 因此有可能,例如,addAll(c)添加一些元素会失败(抛出异常)。
vii.BlockingQueue上不支持任何类型的close或shutdown操作,close、shutdown操作表示不再添加元素。这些功能的需求和使用往往取决于实现类。例如,一个常见的策略是生产者插入结束流或者特殊的对象,消费者会使用相应地解释。
viii.BlockingQueue可以安全地被多个生产者和多个消费者同时使用。
viii.内存一致性效果:与其他并发集合一样,线程优先把对象放在BlockingQueue中,线程中的操作在在另一个线程中的 BlockingQueue 访问或删除该元素之后操作。

3.方法的区别

i.boolean add(E e)、boolean offer(E e)、put(E e) throws InterruptedException、
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException
		boolean add(E e) : 没有可用空间返回IllegalStateException。
		boolean offer(E e) : 没有可用空间返回null
		put(E e) throws InterruptedException : 有可用空间则将指定元素插入队列,无可用空间则等待。 在等待时被打断会抛 InterruptedException
		boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException: 有可用空间则将指定元素插入队列,无可用空间则等待指定等待时间。
	ii.E take() throws InterruptedException、E poll(long timeout, TimeUnit unit) throws InterruptedException、boolean remove(Object o)
		take : 检索并删除此队列的头,有可能需要等待元素可用。 
		poll :检索并删除此队列的头,等待指定的等待时间到元素变为可用
		remove : 从该队列中删除指定元素 
	iii.remainingCapacity()
		返回此队列在理想情况下(在没有内存或资源限制的情况下)可以不阻塞添加的元素数,如果没有内在的限制返回Integer.MAX。
	iv.int drainTo(Collection<? super E> c) : 从该队列中删除所有可用的元素,并将它们添加到给定的集合c中。
	此操作比重复轮询poll()更有效。尝试向集合c添加元素时可能会抛出异常,可能会导致元素不在两个集合中。 
	尝试在队列放自身会导致IllegalArgumentException 。 此外,如果在操作进行中修改了指定的集合,此操作的行为是未定义的。
	v.int drainTo(Collection<? super E> c, int maxElements) : 最多从该队列中删除给定数量的可用元素,并将它们添加到给定的集合中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值