我正在用Java设计一个独立的多线程应用程序。 我正在尝试为他的项目选择最好的事件处理解决方案。
我有1-3个线程生成事件(例如,comm thread完成文件上传),而其他线程可能希望注册此事件的通知。 我希望事件生成和事件监听尽可能地解耦。
你有什么建议?
答案 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)
使用命令设计模式去耦