Java中的多线程观察器 - 保持正确的顺序

时间:2015-02-27 18:44:20

标签: java multithreading observers

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

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

什么是最好的方法?

最天真的是在“同步”块中添加和通知。但我相信它可能会很慢等等。

其次我尝试过只添加要设置的元素,并将其添加到“通知队列”。每次添加元素时,都会检查是否已打开通知。如果没有,则在队列为空之前启动它。它工作得很好,但我担心这不是很好的方法。

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

我希望我已经很好地描述了一切。如果没有,请告诉我,我会尽力解决。 什么是完成此任务的最佳方法? 谢谢!

1 个答案:

答案 0 :(得分:1)

您的第二个解决方案可以改进使用BlockingQueue:使用它您不需要检查是否已打开"通知",您只需调用take(),并且它会等待队列中出现的东西。

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

  

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