Java中的阻塞队列,可以基于BlockingQueue接口自定义实现多种自定义阻塞队列。阻塞队列最经典的应用主要是帮助线程池管理任务,是一个经典的等待/通知(生产者/消费者)模型。这里根据源码主要介绍几种比较经典的实现,并提炼出一些经典范式。
add | remove | 抛出异常 |
---|---|---|
put | take | 等待直到中断 |
offer | poll | 直接返回 |
offer(time) | poll(time) | 设定等待时间 |
LinkedBlockingQueue(基于链表的有界阻塞队列)
Executors.newFixedThreadPool(根据需要可重用部分消费者线程数)和Executors.newSingledThreadPool(单个消费者线程)都使用了LinkedBlockingQueue无界队列来管理任务。
put/take(double lock+wait/notify)
通过双锁来增加队列的并发度,通过wait/notify进行等待/通知。因为通常无界队列默认可以容下Integer.MAX_VALUE的任务。
Design Bounded Blocking Queue
设计一个阻塞队列,通过等待通知机制设计一个阻塞队列。
1 | package P1188; |