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

这个不清楚

二、阻塞队列一共有四套方法分别用来进行insertremoveexamine,当每套方法对应的操作不能马上执行时会有不同的反应,下面这个表格就分类列出了这些方法:

-Throws ExceptionSpecial ValueBlocksTimes 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

原文地址:https://www.cnblogs.com/longsanshi/p/8594896.html