阻塞队列应该定义在ProducerClass还是Consumerclass?

Should blocking queue be defined in Producer Class or Consumer class?

我制作了 2 个 class 生产者和消费者。生产者 class 创建线程并将项目推送到阻塞队列,消费者 class 也创建线程从阻塞队列中获取项目。

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

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

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

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

应该在生产者中实例化一个阻塞队列class,因为生产者实际上控制着这个collection。消费者会告诉生产者生产。生产者 return 不是成品,而是阻塞 collection 并将其设置为在生产完成后完成。这样,消费者可以迭代阻塞 collection 并知道何时中断此迭代。根据这个流程,我将在 Producer 范围内实例化阻塞 collection 。但这并不重要。否则,生产者将在创建的外部范围内接受 a 的参数 collection。事实证明这是一个品味问题,我认为让制作人 return collection

更干净

我更喜欢a)

BlockingQueue result = producer.produce();
while (!result.isCompleted) {}

超过 b)

BlockingQueue result = new BlockingQueue();
producer.produce(result);
while (!result.isCompleted) {}

由于 Java 现在没有引用(仅引用的副本),使用我的首选解决方案 a) 将给予生产者随时覆盖 BlockingQueue 的所有自由而不会造成麻烦给消费者。

单身不是好习惯,应尽可能避免:

  • 单身会使您的测试复杂化,因为您无法模拟它们。
  • 单例由于其静态性质而引入高耦合。
  • 并且由于它们的静态特性,它们在并发场景中的成本很高(这可能与您的情况无关),因为它们需要同步或 thread-safety
  • 单例在生命周期上是不可控的。它的生命周期与应用程序(或域)的生命周期相关