Java,设计模式:多个事件源和一个事件处理程序

时间:2010-06-04 16:43:48

标签: java design-patterns multithreading event-handling

我想在Java中实现一个设计,我有多个事件源(Threads)。此类事件源完成特定任务,必须通知唯一的事件处理程序(类),并且必须根据事件源通知完成其他任务。

我的问题是:如何在Java中以适当的方式实现这个设计? 有一种类似于这种设计的设计模式吗?

提前谢谢你:)。

5 个答案:

答案 0 :(得分:3)

我认为您正在寻找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();
 }
}

答案 1 :(得分:0)

听起来像演员模式对我来说。每个线程充当一个actor,完成一个单独的任务。结果被设置在一个队列(是),由下一个演员处理。

我没有使用java actor框架的经验。请向Google咨询。

答案 2 :(得分:0)

GWT中,这称为event bus。 GWT。HandlerManager或GWTx。PropertyChangeSupport是Google推荐的实施方式。后者自J2.2以来在J2SE中可用

答案 3 :(得分:0)

也许我不明白你的问题,但我认为你不需要任何设计模式,而是来自java.util.concurrent包的东西。

ThreadPoolExecutor?

答案 4 :(得分:0)

可观察模式对线程没有意见。在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() );