Java中的通知系统

时间:2013-05-20 13:11:28

标签: java notifications

我正在为我的系统构建一个API,它接收UDP消息并解析它们。现在我需要通知开发人员这些变化。

目前我有2个实现,但我不确定哪个更好,是否有其他选项。

解决方案A ArrayBlockingQueue

它似乎在空转时不消耗任何动力。在API方面,我只想创建一个静态数组,并在我想要通知新的更改时向其添加消息。所以在开发人员方面,我可以把它放在一个线程中来监听任何新消息。用户将获取消息,检查其类型和属性等。

解决方案B 回调

我相信这个解决方案会更漂亮,更有条理。我只是创建一个包含所有可能的通知类型的接口,然后开发人员可以实现此接口。在API方面,我有一个相同侦听器的哈希映射,以便API可以通知多个相同类型的侦听器。

还有更多想法或建议吗?

2 个答案:

答案 0 :(得分:4)

对于任何基于事件的系统,非常优选异步解决方案。正如您所注意到的,它比阻塞解决方案更轻量级,它需要每个事件接收器的线程。因此,解决方案B受到青睐。

但是,要注意的一件事是线程问题:您将在自己的线程中调用回调,因此回调实现者必须准备好处理它。回调代码不能假定它在任何特定线程上执行;它也可能每次都在不同的线程上执行。

答案 1 :(得分:2)

Observer模式可能对您有所帮助,特别是如果同一主题可能有多个侦听器。

定义侦听器的散列映射的另一种方法是使用侦听器的CopyOnWriteArrayList。通过这种方法,添加新的侦听器不会干扰对侦听器的迭代。

定义接受所有可能的通知类型的接口的替代方法是使用单个方法定义接口,接受所有可能通知类型的根类或接口。例如,此接口可以接收任何子类化参数化类型EVENT的事件对象。

public interface IObserver<EVENT> {
    public void receive( @NonNull EVENT event );
}