我想在Java中实现一个有多个事件源(线程)的设计。此类事件源完成特定任务,并且必须通知唯一的事件处理程序(Class),并且必须根据事件源通知完成其他任务。Java,设计模式:多个事件源和一个事件处理程序
我的问题是:如何在Java中以适当的方式实现这个desiqn? 有一个类似于这种设计的设计模式?
谢谢你提前:)。
我想在Java中实现一个有多个事件源(线程)的设计。此类事件源完成特定任务,并且必须通知唯一的事件处理程序(Class),并且必须根据事件源通知完成其他任务。Java,设计模式:多个事件源和一个事件处理程序
我的问题是:如何在Java中以适当的方式实现这个desiqn? 有一个类似于这种设计的设计模式?
谢谢你提前:)。
我认为你正在寻找Observer模式。 Java确实有一些标准接口(java.util.Observer,java.util.Observable),尽管它们不是类型特定的;所以你可能会考虑你自己的,如果该领域似乎需要它。
class MyThread implements Runnable {
Observable observable;
public MyThread(EventHandler observer) {
observable = new Observable();
observable.addObserver(observer);
}
public void run() {
while (!done()) {
Object result = doStuff();
observable.notifyObservers(result);
}
}
}
// might have this be singleton
class EventHandler implements Observer {
public synchronized void update(Observable o, Object arg) {
accomplishOtherTask();
}
}
的回调方法中使用了一个同步块。谢谢Justin的回复。 我尝试了这个解决方案,但是问题出现在Threads(被认为是Observable)中,因为我的线程已经从另一个类继承,并且如果你想使用Observable,你必须从它延伸,并且正如你所知,不允许多重继承在Java中。 你有什么建议吗? – Zakaria 2010-06-04 17:13:08
你的线程可以包含一个Observable,或者你可以让你的基类扩展Observable。除了其他原因外,使用runnable(而不是扩展Thread)是首选。 – Justin 2010-06-04 17:49:10
谢谢! 我了解你的想法,并实施它。 但我真的不明白你的代码示例: 首先,我们不能实现Observable,我们必须扩展它。可能你的意思是观察员。 如果这是正确的你的代码示例是好的。 – Zakaria 2010-06-04 18:21:07
听起来像演员模式给我。每个线程都扮演一个角色,完成一项任务。结果设置在队列中(是),由下一个演员处理。
虽然我没有Java演员框架的经验。请向Google咨询。
谢谢Arjan Molenaar的回应。 我将谷歌为Java的Actor框架,你能给我进一步的解释吗? – Zakaria 2010-06-04 17:15:01
在GWT中,这被称为event bus。无论是GWT。 HandlerManager或GWTx。 PropertyChangeSupport是Google推荐的实现。后者在J2SE 1.4.2以上版本中可用
也许我不明白你的问题,但我认为你不需要任何设计模式,但是从java.util.concurrent包中得到了一些东西。
ThreadPoolExecutor?
可观察模式对线程没有意见。在EventThread pattern中,监听器可以声明在什么线程中以及何时处理事件。
public class MyObservableObject {
...
void addListener(MyListener listener, Executor executor);
}
public interface MyListener {
void onEvent(Object sender, Object event);
}
// Example
obj.addListener(myListener, CURRENT_THREAD);
obj.addListener(myListener, myWorkQueue);
obj.addListener(myListener, AWT_EDT); // or SWT_EDT
obj.addListener(myListener, Executors.newSingleThreadScheduledExecutor());
大声笑@答案:3种不同的模式! – Pindatjuh 2010-06-04 16:50:56
你能给我一个吗? – Zakaria 2010-06-04 17:15:23
很好的问题,我只是在处理程序类 – fasseg 2010-06-04 17:42:36