gpt4 book ai didi

java - Java 中的异步事件调度

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:42:05 25 4
gpt4 key购买 nike

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

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

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.util.concurrent 包中的执行器。这就是异步回调在 Raptor framework 中的处理方式:

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

注意。此计划是重复的。

关于java - Java 中的异步事件调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2112599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com