Java中的异步事件调度

Java中的异步事件调度,java,events,asynchronous,Java,Events,Asynchronous,我正在将一个C#程序移植到Java,该程序大量使用委托和委托的BeginInvoke方法异步通知事件。以数据通信线程为例。它可能必须通知另一个工作线程它的状态以及GUI 在我看来,通知不同类的各种事件的最佳方式是使用IClassNameHereWatcher接口,该接口定义类“发布”的所有事件类型事件需要通知,然后需要侦听的每个类将实现该接口并将自己注册为侦听器。我不太确定的是如何使它异步。这里大致是我指的: public interface IFrobWatcher { void fr

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

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

public interface IFrobWatcher {
    void frobDidSomething();
    void frobReceivedData(object data);
}

public class Frob implements Runnable {
    List<IFrobWatcher> watchers = new ArrayList<IFrobWatcher>();

    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();
    }
}
公共接口IFrobWatcher{
void frobDidSomething();
void frobReceivedData(对象数据);
}
公共类Frob实现可运行{
列表观察者=新的ArrayList();
私家车{
while(true){
//长时间运行任务
如果(废话)notifyWeDidSomething();
notifyOfData(someDataObject);
}
}
public void addWatcher(IFrobWatcher-watcher){
watchers.Add(watcher);
}
私有void notifyWidedSomething(){
for(IFrobWatcher-watcher:watchers){
watcher.frobDidSomething();//如何使其异步?
}
}
私有void notifyOfData(对象someDataObject){
for(IFrobWatcher-watcher:watchers){
frobReceivedData(someDataObject);//如何使其异步?
}
}
}
公共类FrobWatcher实现IFrobWatcher{
私人Frob frobToWatch;
公共FrobWatcher(Frob Frob){
frobToWatch=frob;
frobToWatch.addListener(这个);
}
公共void FrobDidSomething(){
System.out.println(“Frob做了点什么!”);
}
接收到的数据(对象)的公共无效{
System.out.println(“Frob received:+received.ToString());
}
公共静态void main(字符串[]args){
Frob f=新Frob();
FrobWatcher fw=新FrobWatcher(f);
(新线程(f)).start();
}
}

这是一个相当简单的例子,但希望它能传达我想要的。如果有什么不清楚或不合理的地方,请发表评论,我将尝试澄清或修复该示例。

我会推荐java.util.concurrent包中的执行器。 以下是在中处理异步回调的方式:


注意。此计划正在重复执行。

看起来Executor框架可能会工作!如果我调用
newSingleThreadExecutor()
,然后对调用
notifyWeDidSomething
的对象调用
execute
,事件通知将是异步的,对吗?
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(
    filesPoller, 0 /*initial delay*/,
    checkInterval,
    TimeUnit.MILLISECONDS
);