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

Java,设计模式:多个事件源和一个事件处理程序,java,design-patterns,multithreading,event-handling,Java,Design Patterns,Multithreading,Event Handling,我想用Java实现一个设计,其中我有多个事件源(线程)。此类事件源完成特定任务,必须通知唯一的事件处理程序(类),此事件源必须根据事件源通知完成其他任务 我的问题是:如何在Java中以适当的方式实现这个设计? 有没有一种设计模式类似于这种设计 提前谢谢:)。我想您正在寻找图案。Java确实有一些标准接口(Java.util.Observer、Java.util.Observable),尽管这些接口不是特定于类型的;所以,如果域名需要它,你可以考虑自己的。 class MyThread imple

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

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


提前谢谢:)。

我想您正在寻找图案。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();
 }
}

听起来像是一个演员的模式。每个线程充当一个参与者,完成一项任务。在要由下一个参与者处理的队列(yes)上设置eoutcome


不过,我没有使用java actor框架的经验。请咨询谷歌。

在中,这被称为。要么是GWT。或GWTx。是谷歌推荐的实现。后者在J2SE中自1.4.2起就可以使用,也许我不理解您的问题,但我认为您不需要任何设计模式,只需要软件包中的一些东西


ThreadPoolExecutor?

可观察的模式对线程没有意见。在中,侦听器可以说明在哪个线程中以及何时处理事件

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() );

谢谢贾斯汀的回复。我尝试过这个解决方案,但问题出在线程(被认为是可观察的)上,因为我的线程已经从另一个类扩展而来,如果你想使用可观察的,你必须从它扩展,正如你所知道的,Java中不允许多重继承。你有什么建议吗?你的线程可以包含一个Observable,或者你可以让你的基类扩展Observable。出于其他原因,最好使用runnable(而不是扩展线程)。谢谢!我理解你的想法,并实施了它。但我真的不理解您的代码示例:首先,我们不能实现Observable,我们必须扩展它。也许你指的是观察者。如果这是正确的,你的代码样本是好的。啊,是的,修复了它。对于可运行的建议,他们可能应该将模式部件命名为Observator和(其他看起来不一样的东西:ObservationProducer)+1。Java不允许多重继承,但它有很多方法可以通过使用接口来解决这个问题。感谢Arjan Molenaar的回复。我会用谷歌搜索Java中的Actor框架,你能给我进一步的解释吗?好问题,我会在handler类的回调方法中使用一个同步块谢谢你的回答。我可以将这些实现用于非GUI事件吗?HandlerManager只是一个观察者队列。在HandlerManager上触发事件时,管理器将检查每个观察者是否能够响应事件。如果可以,则将使用适当的参数调用overserver,依此类推。是的,Zakaria、java.beans.PropertyChangeSupport可用于非GUI事件。