BlockingQueue 阻塞队列2
一、各自特点:
1.ArrayBlockingQueue
1)元素的放入和取出都是用同一个锁,所以放入和取出元素并不能够并行运行,LinkedBlockingQueue放入和取出用的是独立锁
2)定长的,初始化时候需要设定
3)和LinkedBlockingQueue对比需要更加少的空间,ArrayBlockingQueue在插入或删除元素时不会产生或销毁任何额外的对象实例,而LinkedBlockingQueue会生成一个额外的Node对象
4)创建时候可以设定是否用公平锁,默认非公平锁
2.LinkedBlockingQueue
1)相对于ArrayBlockingQueue,能够处理更高的并发,因为添加和取出用的独立锁,性能会跟好些
2)如果不设置容量,默认容量为最大整形数(Integer.MAX_VALUE),如果生成大于消费,长时间运行会导致内存消耗殆尽
3.PriorityBlockingQueue
1)采用公平锁
2)不会阻塞生产者,只会阻塞消费者,所有运用场景应该是消费能力大于生成能力,否则可能导致堆空间
4.DelayQueue
1)无限大容量
2)可以设置队列里面的对象被延时取出
5. SynchronousQueue
这个不清楚
二、阻塞队列一共有四套方法分别用来进行insert
、remove
和examine
,当每套方法对应的操作不能马上执行时会有不同的反应,下面这个表格就分类列出了这些方法:
- | Throws Exception | Special Value | Blocks | Times Out |
---|---|---|---|---|
Insert | add(o) | offer(o) | put(o) | offer(o, timeout, timeunit) |
Remove | remove(o) | poll() | take() | poll(timeout, timeunit) |
Examine | element() | peek() |
1. ThrowsException:如果操作不能马上进行,则抛出异常
2. SpecialValue:如果操作不能马上进行,将会返回一个特殊的值,一般是true或者false
3. Blocks:如果操作不能马上进行,操作会被阻塞
4. TimesOut:如果操作不能马上进行,操作会被阻塞指定的时间,如果指定时间没执行,则返回一个特殊值,一般是true或者false
还有:drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数),
通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。这个不清楚
根据不同的业务场景选用不同,一般用timeout的这种,预留一定的时间去执行,执行失败有返回值,可以判断操作的失败与否
参考:http://wsmajunfeng.iteye.com/blog/1629354
http://blog.csdn.net/suifeng3051/article/details/48807423