队列Queue-05
【摘要】 1.TransferQueue 简介如果有消费者正在获取元素,则将队列中的元素传递给消费者。如果没有消费者,则等待消费者消费。我把它称作使命必达队列,必须将任务完成才能返回。 2.理解三个方法针对TransferQueue的transfer方法:圆通快递员要将小明的 2 个快递送货到门,韵达快递员也想将小明的 2 个快递送货到门。小明一次只能拿一个,快递员必须等小明拿了一个后,才能继续给第...
1.TransferQueue 简介
如果有消费者正在获取元素,则将队列中的元素传递给消费者。如果没有消费者,则等待消费者消费。我把它称作使命必达队列,必须将任务完成才能返回。
2.理解三个方法
针对TransferQueue的transfer方法:
圆通快递员要将小明的 2 个快递送货到门,韵达快递员也想将小明的 2 个快递送货到门。小明一次只能拿一个,快递员必须等小明拿了一个后,才能继续给第二个。
针对TransferQueue的tryTransfer方法:
圆通快递员要将小明的 2 个快递送货到门,韵达快递员也想将小明的 2 个快递送货到门。发现小明不在家,就把快递直接放到菜鸟驿站了。
针对TransferQueue的tryTransfer超时方法:
圆通快递员要将小明的 2 个快递送货到门,韵达快递员也想将小明的 2 个快递送货到门。发现小明不在家,于是先等了 5 分钟,发现小明还没有回来,就把快递直接放到菜鸟驿站了。
3.TransferQueue 的原理解析
transfer方法的原理:
- 原理图解释:生产者线程 Producer Thread 尝试将元素 B 传给消费者线程,如果没有消费者线程,则将元素 B 放到尾节点。并且生产者线程等待元素 B 被消费。当元素 B 被消费后,生产者线程返回。
- 如果当前有消费者正在等待接收元素(消费者通过 take 方法或超时限制的 poll 方法时),transfer 方法可以把生产者传入的元素立刻 transfer(传输)给消费者。
- 如果没有消费者等待接收元素,transfer 方法会将元素放在队列的 tail(尾)节点,并等到该元素被消费者消费了才返回。
tryTransfer(E e)
- 试探生产者传入的元素是否能直接传给消费者。
- 如果没有消费者等待接收元素,则返回 false。
- 和 transfer 方法的区别是,无论消费者是否接收,方法立即返回。
tryTransfer(E e, long timeout, TimeUnit unit)
- 带有时间限制的 tryTransfer 方法。
- 试图把生产者传入的元素直接传给消费者。
- 如果没有消费者消费该元素则等待指定的时间再返回。
- 如果超时了还没有消费元素,则返回 false。
- 如果在超时时间内消费了元素,则返回 true。
getWaitingConsumerCount()
- 获取通过 BlockingQueue.take()方法或超时限制 poll 方法等待接受元素的消费者数量。近似值。
- 返回等待接收元素的消费者数量。
hasWaitingConsumer()
- 获取是否有通过 BlockingQueue.tabke()方法或超时限制 poll 方法等待接受元素的消费者。
- 返回 true 则表示至少有一个等待消费者。
4.TransferQueue 接口实现与继承
TransferQueue接口继承了哪些接口:
- BlockingQueue 接口,可作为阻塞队列使用
- Queue 接口,可作为队列使用
哪些类实现了TransferQueue接口:
- LinkedTranferQueue 接口
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)