Java中的异步事件调度

我正在将一个C#程序移植到Java中,它大量使用委托和委托的BeginInvoke方法来异步通知事件。 以数据通信线程为例。 它可能必须通知另一个工作线程的状态以及GUI。

在我看来,通知不同类的各种事件的最佳方式是有一个IClassNameHereWatcher接口,它定义了“发布”事件需要通知的所有类型的事件,然后是需要的每个类。监听将实现此接口并将自己注册为侦听器。 我不太确定的是如何使这个异步。 这是我所指的大概:

 public interface IFrobWatcher { void frobDidSomething(); void frobReceivedData(object data); } public class Frob implements Runnable { List watchers = new ArrayList(); private void run() { while (true) { // Long running task if (blah) notifyWeDidSomething(); notifyOfData(someDataObject); } } public void addWatcher(IFrobWatcher watcher) { watchers.Add(watcher); } private void notifyWeDidSomething() { for (IFrobWatcher watcher : watchers) { watcher.frobDidSomething(); // How do I make this asynchronous? } } private void notifyOfData(object someDataObject) { for (IFrobWatcher watcher : watchers) { watcher.frobReceivedData(someDataObject); // How do I make this asynchronous? } } } public class FrobWatcher implements IFrobWatcher { private Frob frobToWatch; public FrobWatcher(Frob frob) { frobToWatch = frob; frobToWatch.addListener(this); } public void FrobDidSomething() { System.out.println("Frob did something!"); } public void FrobReceivedData(object received) { System.out.println("Frob received: " + received.ToString()); } public static void main(string[] args) { Frob f = new Frob(); FrobWatcher fw = new FrobWatcher(f); (new Thread(f)).start(); } } 

这是一个相当简化的例子,但希望它传达了我正在寻找的东西。 如果某些内容不明确或没有意义,请发表评论,我会尝试澄清或修复该示例。

我建议使用java.util.concurrent包中的Executor。 这是Raptor框架中处理异步回调的方式:

 scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate( filesPoller, 0 /*initial delay*/, checkInterval, TimeUnit.MILLISECONDS ); 

NB。 这种安排是反复出现的。