我正在将 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.util.concurrent 包中的执行器。
这就是异步回调的处理方式猛禽框架 http://github.com/schildmeijer/raptor/blob/master/src/main/java/org/raptorframework/raptor/AsyncFileMonitor.java:
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(
filesPoller, 0 /*initial delay*/,
checkInterval,
TimeUnit.MILLISECONDS
);
注意。该调度是重复进行的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)