概述
常用方法
boolean add(E e)
:队列会保存数据,不做阻塞等待。void transfer(E e)
:是TransferQueue的特有方法。必须有消费者(take()方法调用者)。如果没有任意线程消费数据,transfer方法阻塞。一般用于处理及时消息。
由链表组成的无界队列,相比其他队列,多了transfer和tryTransfer方法。
这两个方法的作用是预占,即消费者取元素,队列非空,则直接取走数据,若队列为空,则生成一个节点入队(元素为null的节点),消费者线程被等待在这个节点上,后面生产者入队时发现有一个元素为null的节点,就不入队了,直接将元素填充到该节点上,同时唤醒这个节点上的消费线程。
源码分析
Node
预占队列中的Node模型有如下属性:
final boolean isData;
当该node是消费者创建的null节点,这里是false,如果是生产者生成的节点,这里为true
评论区