java.util.concurrent包下的新类。LinkedBlockingQueue就是其中之一,是一个阻塞的线程安全的队列,底层采用链表实现。java
LinkedBlockingQueue构造的时候若没有指定大小,则默认大小为Integer.MAX_VALUE,固然也能够在构造函数的参数中指定大小。LinkedBlockingQueue不接受null。算法
添加元素的方法有三个:add,put,offer,且这三个元素都是向队列尾部添加元素的意思。api
区别:安全
add方法在添加元素的时候,若超出了度列的长度会直接抛出异常: 并发
put方法,若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。 函数
offer方法在添加元素时,若是发现队列已满没法添加的话,会直接返回false。 性能
从队列中取出并移除头元素的方法有:poll,remove,take。 spa
poll: 若队列为空,返回null。线程
remove:若队列为空,抛出NoSuchElementException异常。对象
take:若队列为空,发生阻塞,等待有元素。
并发库中的BlockingQueue是一个比较好玩的类,顾名思义,就是阻塞队列。该类主要提供了两个方法put()和take(),前者将一个对象放到队列中,若是队列已经满了,就等待直到有空闲节点;后者从head取一个对象,若是没有对象,就等待直到有可取的对象。
下面的例子比较简单,一个读线程,用于将要处理的文件对象添加到阻塞队列中,
另外四个写线程用于取出文件对象,为了模拟写操做耗时长的特色,特让线程睡眠一段随机长度的时间。另外,该Demo也使用到了线程池和原子整型(AtomicInteger),AtomicInteger能够在并发状况下达到原子化更新,避免使用了synchronized,并且性能很是高。因为阻塞队列的put和take操做会阻塞,为了使线程退出,特在队列中添加了一个“标识”,算法中也叫“哨兵”,当发现这个哨兵后,写线程就退出。