Queue

1)阻塞队列BlockingQueue

BlockingQueue用法:BlockingQueue通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。

下图是对这个原理的阐述:一个线程往里边放,另外一个线程从里边取的一个BlockingQueue。


一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。
也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的将会线程在往里边插
入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对象。
负责消费的线程将会一直从该阻塞队列中拿出对象。消费如果线程尝试去从一个空的队列中
提取对象的话教育,这个消费线程将会处于阻塞之中,直到一个生产线程把一个对象丢进队列。

BlockingQueue的方法
BlockingQueue具有4组不同的方法用于插入,移除以及对队列中的元素进行检查。如果
请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:

四组不同的行为方式解释:
1 。抛异常:如果试图的操作无法立即执行,抛一个异常
.2。特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是真/假)
.3。阻塞:如果试图的操作无法。立即执行,该方法调用将会发生阻塞,直到能够执行
4. 超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,等但
待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是真/假)。
无法向一个BlockingQueue中插入null。如果你试图插入null,BlockingQueue将会抛出
一个NullPointerException。

2)数组阻塞队列 ArrayBlockingQueue

ArrayBlockingQueue 类实现了 BlockingQueue 接口。
ArrayBlockingQueue 是一个有界的阻塞队列,其内部实现是将对象放到一个数组里。有界
也就意味着,它不能够存储无限多数量的元素。它有一个同一时间能够存储元素数量的上限。

ArrayBlockingQueue 内部以 FIFO(先进先出)的顺序对元素进行存储。队列中的头元素在所
有元素之中是放入时间最久的那个,而尾元素则是最短的那个。

3)延迟队列 DelayQueue

DelayQueue 实现了 BlockingQueue 接口。
DelayQueue 对元素进行持有直到一个特定的延迟到期。注入其中的元素必须实现
java.util.concurrent.Delayed 接口,该接口定义:
public interface Delayed extends Comparable<Delayed< {
public long getDelay(TimeUnit timeUnit);
}
DelayQueue 将会在每个元素的 getDelay() 方法返回的值的时间段之后才释放掉该元素。如
果返回的是 0 或者负值,延迟将被认为过期,该元素将会在 DelayQueue 的下一次 take 
被调用的时候被释放掉。
传递给 getDelay 方法的 getDelay 实例是一个枚举类型,它表明了将要延迟的时间段。
TimeUnit 枚举将会取以下值:
DAYS
HOURS
MINUTES
SECONDS
MILLISECONDS
MICROSECONDS
NANOSECONDS

正如你所看到的,Delayed 接口也继承了 java.lang.Comparable 接口,这也就意味着 Delayed 
对象之间可以进行对比。这个可能在对 DelayQueue 队列中的元素进行排序时有用,因此它
们可以根据过期时间进行有序释放。

4)链阻塞队列 LinkedBlockingQueue

LinkedBlockingQueue 类实现了 BlockingQueue 接口。
LinkedBlockingQueue 内部以一个链式结构(链接节点)对其元素进行存储。如果需要的话,
这一链式结构可以选择一个上限。如果没有定义上限,将使用 Integer.MAX_VALUE 作为
上限。
LinkedBlockingQueue 内部以 FIFO(先进先出)的顺序对元素进行存储。队列中的头元素在所
有元素之中是放入时间最久的那个,而尾元素则是最短的那个。

5)具有优先级的阻塞队列PriorityBlockingQueue

PriorityBlockingQueue 类实现了 BlockingQueue 接口。
PriorityBlockingQueue 是一个无界的并发队列。它使用了和类 java.util.PriorityQueue 一样的
排序规则。你无法向这个队列中插入 null 值。
所有插入到 PriorityBlockingQueue 的元素必须实现 java.lang.Comparable 接口。因此该队
列中元素的排序就取决于你自己的 Comparable 实现。
注意 PriorityBlockingQueue 对于具有相等优先级(compare() == 0)的元素并不强制任何特定
行为。

6)同步队列 SynchronousQueue

SynchronousQueue 类实现了 BlockingQueue 接口。
SynchronousQueue 是一个特殊的队列,它的内部同时只能够容纳单个元素。如果该队列已
有一元素的话,试图向队列中插入一个新元素的线程将会阻塞,直到另一个线程将该元素从
队列中抽走。同样,如果该队列为空,试图向队列中抽取一个元素的线程将会阻塞,直到另
一个线程向队列中插入了一条新的元素。
据此,把这个类称作一个队列显然是夸大其词了。它更多像是一个汇合点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值