含义:是一个支持两个附加操作的队列,这两个附加操作分别是:在队列为空的时候,获取元素的线程等待队列变为非空,当队列满时,存储元素的线程会等待队列可用
接口:BlockingQueue< E>
他的所有超级接口:Collection,Iterable,Queue
常用方法:
public Boolean add(E e)将指定的元素插入到此队列中,成功后返回 IllegalStateException,如果当前没有可用空间,则抛出IllegalStateException。
public boolean offer(E e) 将指定的元素插入到此队列中,成功返回true,失败为 false
public void put(E e) 将指定的元素插入到此队列中,如果没有空间则等待可用的时候
public E poll(long timeout, TimeUnit unit) 检索并删除此队列的头,等待指定的等待时间(如有必要)使元素变为可用。
public E take() 检索并删除此队列的头,如有必要,等待元素可用。
常用实现类:
ArrayBlockingQueue,LinkedBlockingQueue,SynchronousQueue
队列 | 有界性 | 锁 | 数据结构 |
---|---|---|---|
ArrayBlockingQueue | bounded(有界,即为有容量限制) | 加锁 | ArrayList |
LinkedBlockingQueue | optionally-bounded(可选有界) | 加锁 | LinkedList |
SynchronousQueue | bounded(有界) | 加锁 | 无 |
SynchronousQueue是一个不存储元素的阻塞队列,每一个put操作必须等待take操作,否则不能添加元素
//ArrayBlockingQueue,容量有限制,所以必须指定长度
BlockingQueue<String> bq = new ArrayBlockingQueue<>(3);
bq.add("aaa");
bq.add("bbb");
bq.add("ccc");
bq.add("ddd"); //报错
boolean b=bq.offer("ddd");//没有添加进去,返回false
bq.put("ddd"); //添加元素,如果队列满了,则等待
System.out.println(bq.take()); //先进先出原则
BlockingQueue<String> bq = new SynchronousQueue<>();
bq.add("aaa"); //报错,不能存储元素
bq.put("aaa");//一直等待,无法添加元素