https://www.cnblogs.com/xuxiuxiu/p/6830485.html
BlockingQueue接口
ArrayBlockingQueue:基于数组的阻塞队列实现,在ArrayBlockingQueue内部,维护了一个定长数组,
以便缓存队列中的数据对象,其内部没实现读写分离,也就童味着生产和消费不能完全并行,
长度是需要定义的,可以指定先进先出成者先进后出,也叫有界队列。在很多场合非常适合使用。
LinkedBlockingQueue:基于链表的风塞队列,同ArrayBlockingQueue类似. 其内部也维持着一
个数据缓冲队列(该队列由一个链表构成) ,LinkedBlockingQueue之 所以能够高效的处理并发数据,
是因为其内部实现采用分高锁(读写分高两个锁),从而实现生产者和消费者操作的完全并行运行。
他是一一个无界队列。
SynchronousQueue-种没有缓冲的队列, 生产者产生的数据直接会被消费者获取并消费.
PrioriyBlockingQueue;基于优先级的阻离队列(优先级的判断通过构造所数传入的Compator对象来决定,
也就是说传入队列的对象必须实现Comparable接口),在实现PriorityBlockingQueue时,
内部控制线程同步的锁采用的是公平锁。他也是一一个无界的队列。
DelayQueue;带有延迟时间的Queue,其中的元素只有当其指定的延迟时间到了,
才能够从队列中获取到该元素。DelayQueue中的 元素必须实现Delayed接口,
DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、
任务超时处理、空闲连接的关闭等等。
1.1offer(anObject):表示如果可能的话,将anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,
则返回true,否则返回false.(本方法不阻塞当前执行方法的线程)
1.2offer(E o, long timeout, TimeUnit unit),可以设定等待的时间,如果在指定的时间内,还不能往队列中
加入BlockingQueue,则返回失败。
1.3put(anObject):把anObject加到BlockingQueue里,如果BlockQueue没有空间,则调用此方法的线程被阻断
直到BlockingQueue里面有空间再继续.
获取数据:
1.4 poll(time):取走BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,
取不到时返回null;
1.5 poll(long timeout, TimeUnit unit):从BlockingQueue取出一个队首的对象,如果在指定时间内,
队列一旦有数据可取,则立即返回队列中的数据。否则知道时间超时还没有数据可取,返回失败。
1.6 take():取走BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到
BlockingQueue有新的数据被加入;
drainTo():一次性从BlockingQueue获取所有可用的数据对象(还可以指定获取数据的个数),
通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。