今天要讲的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()
方法同理。.net
BlockingQueue
是一个接口,使用起来比较简单。他的实现类以下:
比较经常使用的是ArrayBlockingQueue
和LinkedBlockingQueue
,从名字也能够看出来,ArrayBlockingQueue
适合作有界队列,LinkedBlockingQueue
适合作无界队列。
这里只看一下简单使用:线程
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10); queue.put("abc"); queue.take();
通常来讲put()
和take()
方法会分散在两个或多个线程中。code
若是你的好奇心比较重,想研究一下BlockingQueue
的实现原理,那么当你看一下ArrayBlockingQueue
的源码,就会发现一些有趣的东西:blog
/** Main lock guarding all access */ final ReentrantLock lock; /** Condition for waiting takes */ private final Condition notEmpty; /** Condition for waiting puts */ private final Condition notFull;
啊哈,就是咱们前面讲过的ReentrantLock
和Condition
了,请参考:https://my.oschina.net/lizaizhong/blog/1825244接口