【发布时间】: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