Асинхронная отправка событий в Java - PullRequest
3 голосов
/ 21 января 2010

Я в процессе переноса программы на 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 Ответ

2 голосов
/ 21 января 2010

Я бы порекомендовал Executor из пакета java.util.concurrent. Вот как асинхронные обратные вызовы обрабатываются в Raptor Framework :

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

NB. это планирование повторяется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...