【问题标题】:LinkedBlockingQueue - producer/consumerLinkedBlockingQueue - 生产者/消费者
【发布时间】:2016-04-22 12:22:18
【问题描述】:
在一个简单的生产者-消费者场景中,我有 2 个线程,围绕 LinkedBlockingQueue 进行管理。
在消费者线程中,我使用take(),即我想在元素进入队列时阻止消费者。
如果在生产者线程中我使用offer()而不是put()添加到队列中,是否可以?这会引起任何问题吗?
我的意思是,使用take() 是否意味着我也应该使用put?
我猜不是,但我想完全确定。
【问题讨论】:
标签:
java
multithreading
concurrency
java.util.concurrent
【解决方案1】:
不,无论您在消费者端使用什么,在生产者上使用offer 都没有问题。
这将是一种允许生产者推送到多个队列之一的常见机制,它可以在每个队列上调用offer,直到成功。它甚至可以在最后一个队列上调用put。
【解决方案2】:
offer 和 put 的区别仅在于,put 将等待一个完整的队列有空间,而offer(带有可选超时)将简单地返回 false(不添加项目)如果队列已满(add 会抛出异常)。
只要您的代码尊重这些差异,那么无论您使用哪种方法都没有问题(当然,有时某个方法更适合某项任务)。