首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是在生产者类还是消费者类中定义阻塞队列?

是在生产者类还是消费者类中定义阻塞队列?
EN

Stack Overflow用户
提问于 2019-06-07 06:45:32
回答 1查看 118关注 0票数 1

我已经制作了两个类别的生产者和消费者。Producer类创建线程并将项目推送到阻塞队列,而使用者类也创建线程,从阻塞队列中获取项。

现在,我想知道一件事。我应该在生产者或消费者类中定义阻塞队列吗?还是应该是在生产者和消费者中都定义的单例对象?

如果我只在一个类中定义,那么我可以通过从另一个类调用该类的方法来访问阻塞队列。这种类型将阻塞队列数据结构封装在该类中,我们只通过使用这些方法来访问该数据结构。但是,我发现通过方法调用看起来就像,一个类依赖于另一个类。

如果我创建一个单例阻塞队列,那么阻塞队列对象将在两个类之间共享。但是我认为在类之间共享集合是不好的做法,让用户知道如何在每个类中使用集合。我不确定这是否真的是一种糟糕的做法。

请提供您对哪一种方式更好的见解?谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 07:44:52

应该在producer类中实例化阻塞队列,因为生产者实际上控制了这个集合。消费者会告诉生产者生产。生产者不返回成品,而是返回阻塞集合,并在完成生产后将其设置为完成。这样,使用者就可以迭代阻塞集合,并知道何时中断此迭代。根据这个流程,我将在生产者范围内实例化阻塞集合。但这并不重要。否则,生产者将在创建的集合中接受外部范围中的参数。这是一个品味的问题,我认为让制片人归还收藏品是更清洁的做法。

我更喜欢a)

代码语言:javascript
运行
复制
BlockingQueue result = producer.produce();
while (!result.isCompleted) {}

(超过b)

代码语言:javascript
运行
复制
BlockingQueue result = new BlockingQueue();
producer.produce(result);
while (!result.isCompleted) {}

由于Java现在不引用(只引用引用的副本),所以使用我喜欢的解决方案a)将给生产者在任何时候覆盖BlockingQueue的所有自由,而不会给消费者带来麻烦。

单身不是好做法,应尽可能避免:

  • 单身汉会使你的测试复杂化,因为你不能嘲笑他们。
  • 单子由于其静态特性而引入高度耦合。
  • 而且,由于它们的静态性质,它们在并发场景(可能与您的情况无关)中非常昂贵,因为它们需要同步或线程安全。
  • 单身人士的一生是无法控制的。它的生存期与应用程序(或域)的生存期相耦合。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56489208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档