【问题标题】:Multithreaded Observer in Java - preserve proper orderJava中的多线程观察者 - 保持正确的顺序
【发布时间】:2015-02-27 18:44:20
【问题描述】:

我正在实现一些我称之为“可观察集”的东西。它只是一个普通的集合,但它可以让一些观察者收到有关添加新元素的通知。

对我来说重要的是,元素可以同时从许多线程中添加,并且还有许多观察线程。我在 CopyOnWriteArrayList 中持有观察者(它是线程安全的)。关键是通知观察者添加元素的方式,每个观察者的通知顺序与添加元素的顺序相同。

什么是最好的方法?

最幼稚的一种是将添加和通知放在“同步”块中。但我相信它可能会很慢等。

我尝试的第二个方法是将元素添加到集合中,然后将其添加到“通知队列”中。每次添加元素时,都会检查是否打开了通知。如果不是,它会一直启动,直到队列为空。它工作得很好,但我担心这不是很好的方法。

我实现的最后一个,我称之为“通知线程”。通过添加观察者,每个观察者都创建了自己的“通知线程”。该线程在后台运行并检查它是否位于全局“通知队列”的末尾。如果不是,它会通知特定线程有关新元素的信息。但是,我在同步和 while(true) 循环方面存在问题。我不知道如何设置条件来结束线程。我在写的时候注意到的下一个问题是,每一个新线程都会从一开始就被通知......这不好。

我希望我已经很好地描述了一切。如果没有,请告诉我,我会尝试修复它。 完成这项任务的最佳方法是什么? 谢谢!

【问题讨论】:

  • "最幼稚的做法是将添加和通知放在“同步”块中。但我相信它可能会很慢等。"你真的试过看它是否很慢?
  • @Sizik 是对的。在您知道需要优化之前,请始终保持简单。
  • 好吧,我已经尝试过了:)但是我为之做的人不允许这样做。这会很慢,因为添加时您必须等待通知所有观察者才能添加下一个元素,而它可以由其他线程同时完成..

标签: java multithreading observers


【解决方案1】:

您的第二个解决方案可以改进为使用BlockingQueue:使用它您不需要检查“通知是否打开”,您只需调用take(),它会等待某些内容出现在排队。

您还可以查看RxJava 项目。它有点复杂,但它有很多您可能需要的功能。

它扩展了观察者模式以支持数据/事件序列,并添加了允许您以声明方式将序列组合在一起的运算符,同时抽象出对低级线程、同步、线程安全和并发数据结构等问题的担忧。

【讨论】:

  • 感谢您的想法。它还可以改进第三种解决方案。
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2021-07-02
  • 2017-08-08
  • 2012-01-22
相关资源
最近更新 更多