Queue常用类解析之BlockingQueue(五):LinkedTransferQueue

Queue常用类解析之PriorityQueue
Queue常用类解析之ConcurrentLinkedQueue
Queue常用类解析之BlockingQueue(一):PriorityBlockingQueue、DelayQueue和DelayedWorkQueue
Queue常用类解析之BlockingQueue(二):ArrayBlockingQueue
Queue常用类解析之BlockingQueue(三):LinkedBlockingQueue
Queue常用类解析之BlockingQueue(四):SynchronousQueue

接着上文对BlockingQueue的介绍继续向下

八、LinkedTransferQueue

1. 接口TransferQueue

TransferQueue是jdk1.7新增的一个接口,是阻塞队列LinkedBlockingQueue的子接口。
TransferQueue适用于生产者必须等待消费者进行接收数据的阻塞队列场景。
在普通的BlockingQueue中,入队操作和出队操作彼此分离,彼此都只和队列打交道,只需要往队列中存取数据,不需要关心对方的存在。而在TransferQueue中是一种生产者-消费者的应用场景,生产者和消费者之间并不是毫无关系的,生成者生成数据需要等待着一个消费者前来接受,否则就是一次失败的入队操作。因此在TransferQueue的入队和出队操作以外,还有一个更重要的操作概念称为transfer,指生产者将数据传递给消费者的过程。
transfer方法表示生产者传递数据给消费者进行消费,tryTransfer则表示在非阻塞或者限时阻塞的情况下这一过程是否成功。
TransferQueue也可以具有一个固定的容量,事实上SynchronousQueue就是一个典型的容量为0的TransferQueue,虽然其并没有实现TransferQueue接口,在容量为0的TransferQueue中,只有消费者接收了数据才能put成功,因此put操作和transfer操作是同义的。
TranferQueue方法
TransferQueue定义了5个方法。
getWaitingConsumerCount和hasWaitingConsumer都与队列中的等待的消费者有关,前者返回等待的消费者数目,后者返回是否有等待的消费者。
tranfer和两个tryTransfer方法都用于transfer操作,分别是阻塞方法,非阻塞方法和限时阻塞方法。

2. 静态内部类Node

final boolean isData;   // false if this is a request node
volatile Object item;   // initially non-null if isData; CASed to match
volatile Node next;
volatile Thread waiter; // null until waiting

和SychronousQueue$TransferQueue#QNode类基本一致,有4个属性。
同样的也有3个特殊状态:
item值为自身:取消状态,表示指定时间内没有找到匹配节点或者线程被中断。被匹配成功时逻辑处理完成后也会将item置为自身。
isData为true但是item为null:不是request节点,也不是data节点,表示一种逻辑节点,一般用于head节点
上述状态的节点称为matched节点,上述状态以外的节点为unmatched节点,是真正需要被匹配的节点。
next值为自身:表示节点从链表中移除,称为offList,在遍历过程中,该类型的节点的下一个节点被视为head节点而不是节点的next节点。
对于item属性,request节点时item为null,data节点时item为数据的具体值,被成功匹配时item为匹配节点的item值,被成功匹配时的匹配逻辑执行完成后为节点自身,取消时为节点自身。

2. LinkedTransferQueue简述

LinkedTransferQueue是一个基于链表结果的无界的TransferQueue。
和大多数的集合不同,由于LinkedTransferQueue中存在着异步操作,因此size()方法并不是一个O(1)的方法,而是需要对集合进行遍历,而且由于遍历过程中队列可能被修改,其返回的结果也并不一定是实时一致的。另外,批量方法的操作也无法保证原子性。
队列中并不直接存储元素,而是封装成data节点(put)或re

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值