我在一个围绕LinkedBlockingQueue
管理的简单生产者 - 消费者场景中有2个主题。
在消费者线程中我使用take()
,即我想在元素进入队列时阻止消费者。
如果在生产者线程中我使用offer()
添加到队列而不是put()
,是否可以?这会导致任何问题吗?
我的意思是,使用take()
是否意味着我也应该使用put
?
我想不是,但我想完全确定。
答案 0 :(得分:1)
不,无论您在消费者端使用什么,都可以在生产者身上使用offer
。
这是允许生产者推送到多个队列之一的常用机制,它可以在每个队列上调用offer
,直到成功为止。它甚至可以在最后一个队列上调用put
。
答案 1 :(得分:0)
offer
和put
的区别仅在于,put
会等待一个完整的队列占用空间,而offer
(带有可选的超时)只会返回false(如果队列已满(并且add
将抛出异常),则不添加项目。
只要您的代码尊重这些差异,那么无论您使用哪种方法都没有问题(当然,有时候某个方法对某项任务更好)。