代码之家  ›  专栏  ›  技术社区  ›  jasonh

Java中的异步事件调度

  •  3
  • jasonh  · 技术社区  · 16 年前

    我正在将一个C#程序移植到Java中,它大量使用委托和委托的 BeginInvoke

    在我看来,通知不同类的各种事件的最好方法是 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();
        }
    }
    

    1 回复  |  直到 16 年前
        1
  •  2
  •   Schildmeijer    16 年前

    我推荐java.util.concurrent包中的一个执行器。 这就是在 Raptor framework :

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