阻塞队列BlockingQueue
BlockingQueue是iuc包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。
主要方法:
方法/处理方式 | 抛出异常 | 返回特殊值 | 一直阻塞 | 超时退出 |
插入数据方法 | add(e) | offer(e) | put(e) | offer(e, timeout, unit) |
移除数据方法 | remove() | poll() | take() | pull(timeout, unit) |
检查方法 | element() | peek() | 不可用 | 不可用 |
实现:
LinkedBlockingQueue(无界队列)、
ArrayBlockingQueue(有固定大小的队列)、
SynchronousQueue(大小为1的队列)。
DelayQueue (对元素进行持有直到一个特定的延迟到期)
PriorityBlockingQueue 是一个无界的并发队列。
经典问题 生产者和消费者问题
阻塞队列的最长使用的例子就是生产者消费者模式,也是各种实现生产者消费者模式方式中首选的方式。
其实阻塞队列实现阻塞同步的方式很简单,使用的就是是lock锁的多条件(condition)阻塞控制。使用BlockingQueue封装了根据条件阻塞线程的过程,而我们就不用关心繁琐的await/signal操作了。
这里抛砖引玉,更多内容请参考:http://ifeve.com/java-blocking-queue/。
推荐个juc讲的比较好的博客:http://www.blogjava.net/xylz/archive/2010/07/08/325587.html。