多线程应用程序中的事件处理

时间:2011-04-26 09:02:45

标签: java multithreading

我正在用Java设计一个独立的多线程应用程序。 我正在尝试为他的项目选择最好的事件处理解决方案。

我有1-3个线程生成事件(例如,comm thread完成文件上传),而其他线程可能希望注册此事件的通知。 我希望事件生成和事件监听尽可能地解耦。

你有什么建议?

5 个答案:

答案 0 :(得分:8)

使用event bus

  

事件总线可以被认为是一个   替换观察者模式,   在观察者模式中,每个   组件正在观察一个可观察的   直。在事件总线模式中,   每个组件都只是订阅   活动巴士等待其活动   要调用的通知方法   当有趣的事件发生时。   通过这种方式,可以使用事件总线   想到了观察者的模式   额外的一层解耦。

关于在GWT中使用事件总线,这是一个很好的presentation。它应该让你对好处有所了解(而且它也很有趣)。

修改

第一个链接主要是作为一个例子给出的。根据自己的需要实现类似的东西真的不是那么难。

答案 1 :(得分:1)

我会使用ExecutorServices来管理你的线程池。这样,当您有一个事件的监听器时,您可以确保使用代理或汉德编码将事件添加到正确的服务。 e.g。

public void onEventOne(final Type parameter) {
    executorService.submit(new Runnable() {
        public void run() {
            wrappedListener.onEventOne(parameter);
        }
    }
}

您可以传递此侦听器包装器,并确保使用所需的线程池处理该事件。

使用代理可以避免这种类型的锅炉板代码。 ;)

答案 2 :(得分:1)

您真的需要一个解决方案,每个线程都可以注册为每种类型的事件的监听器吗?如果是这样,请使用事件总线类型解决方案(或具有类型化事件的集中式observable)。

如果您不需要这种灵活性,经理 - 工作人员设置就足够了,经理会收到事件通知(例如:“我已经完成了我的工作”)并且可以根据需要启动工作人员。

答案 3 :(得分:1)

使用事件总线绝对是正确的选择。那里有各种解决方案。您还可以查看MBassador https://github.com/bennidi/mbassador

它是注释驱动的,非常轻量级并且使用弱引用(因此易于集成在对象生命周期管理由诸如spring或guice或somethign之类的框架完成的环境中)。它提供了对象过滤机制和同步或异步调度/消息处理。而且速度非常快!

Google Guava也有一个事件总线,但它使用强大的引用,如果你没有完全控制你的对象生命周期(例如春天环境),这可能很痛苦

编辑:我为一系列可用的事件总线实现创建了性能和功能比较,包括Guava,MBassador等等。结果非常有趣。在这里查看 http://codeblock.engio.net/?p=37

答案 4 :(得分:0)

使用命令设计模式去耦