阻塞队列概念
定义:阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。
BlockingQueue是个接口,实现有ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue。
本文使用ArrayBlockingQueue:有界的阻塞队列,内部实现是将对象放到一个数组中。jdk源码为:
参数capacity为数组容量;fair为true,插入或删除对象时,按FIFO顺序处理。
阻塞队列工具实现
|
|
ConcurrentHashMap的key为唯一标志uuid,value为阻塞队列。
上述getMsgMap方法创建容量为3的阻塞队列;出队方法queueOut调用poll方法(检索并删除此队列的头),超时时间设置为5秒。
调用
发起阻塞,等待事件:
初始,每个阻塞队列为空,执行出队操作,阻塞直到事件触发或者超时。
事件触发:
入队后,阻塞队列不为空,queueUtil.queueOut(uuid)被触发,执行后续操作your normal logic balabala。
阻塞队列的应用场景为线程间通信(如生产者消费者模式)或为网络通信(socket或http)。