今天要讲的BlockingQueue可谓是大名鼎鼎,在并发编程中比较常见的一个类。
BlockingQueue顾名思义是表示一个阻塞队列,注意这两个词:阻塞和队列。可以拿我们熟悉的生产者-消费者队列来举例,一条流水线上,A生产零件,B组装零件,A就是生产者,B是消费者。如果A生成的太快,则零件堆积,A需要休息一会儿等待B把零件消费完;如果A生产的太慢,则B变得无活可干,被迫休息。
在BlockingQueue中offer()和put()就是把零件放到队列中,poll()和take()就是从队列中取出零件进行消费。需要注意的是put()和take()是阻塞方法,而offer()和poll()是非阻塞方法,也就是put()的时候队列满了,则阻塞;而offer()的时候队列满了,则返回false,不阻塞。take()和poll()方法同理。
BlockingQueue是一个接口,使用起来比较简单。他的实现类如下:

比较常用的是ArrayBlockingQueue和LinkedBlockingQueue,从名字也可以看出来,ArrayBlockingQueue适合做有界队列,LinkedBlockingQueue适合做无界队列。
这里只看一下简单使用:
1 ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10); 2 queue.put("abc"); 3 queue.take();
一般来说put()和take()方法会分散在两个或多个线程中。
如果你的好奇心比较重,想研究一下BlockingQueue的实现原理,那么当你看一下ArrayBlockingQueue的源码,就会发现一些有趣的东西:
1 /** Main lock guarding all access */ 2 final ReentrantLock lock; 3 4 /** Condition for waiting takes */ 5 private final Condition notEmpty; 6 7 /** Condition for waiting puts */ 8 private final Condition notFull;
啊哈,就是我们前面讲过的ReentrantLock和Condition了,请参考:https://my.oschina.net/lizaizhong/blog/1825244