【问题标题】:Asynchronous Event Dispatch in JavaJava 中的异步事件调度
【发布时间】:2011-01-07 22:17:43
【问题描述】:

我正在将一个 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();
    }
}

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

【问题讨论】:

    标签: java events asynchronous


    【解决方案1】:

    我会推荐 java.util.concurrent 包中的 Executor。 这就是Raptor framework 中处理异步回调的方式:

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

    注意。这种安排是重复的。

    【讨论】:

    • 看起来 Executor 框架可以工作了!如果我调用newSingleThreadExecutor(),然后在调用notifyWeDidSomething 的东西上调用execute,事件通知将是异步的,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2017-11-19
    • 2023-03-09
    相关资源
    最近更新 更多