Таймер ActionListener операции в Java - PullRequest
4 голосов
/ 19 октября 2011

Я относительно новичок в java и мне было любопытно, как работают ActionListeners.Скажем, у меня есть прослушиватель действий для таймера, реализованный следующим образом:

class TimerActionListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        //perform some operation
    }
}

Что произойдет, если таймер настроен на работу быстрее, чем может выполнить код в моем классе actionlistener.Завершает ли код выполнение и игнорирует ли новые запросы до тех пор, пока это не будет сделано (например, прерывание).Или новый вызов actionlistener имеет приоритет над текущим экземпляром, так что код никогда не завершится?

Ответы [ 3 ]

8 голосов
/ 19 октября 2011

Синхронизация таймера выполняется в потоке, отличном от потока диспетчеризации событий (или EDT), который является потоком, который выполняет код в ActionListener.Таким образом, даже если код actionPerformed работает медленно, таймер продолжает работать независимо и помещает свой код actionPerformed в очередь событий, которая, скорее всего, будет скопирована, а поток событий будет засорен, и приложение будет не отвечать или плохо реагировать.

Главная точка зрения состоит в том, чтобы избегать вызова любого кода, который занимает немного времени в потоке событий, так как это сделает GUI не отвечающим.Рассмотрите возможность использования SwingWorker для подобных случаев.

Редактировать: Пожалуйста, смотрите комментарий trashgod ниже для победы!

3 голосов
/ 20 октября 2011

Судя по сообщениям из судов на воздушной подушке и trashgod, события Таймера не ставятся в очередь по умолчанию. (т.е. новые события таймера будут игнорироваться, пока не завершится выполнение кода обработчика события таймера.)

2 голосов
/ 19 октября 2011

Вы можете проверить это самостоятельно, реализовав что-то следующим образом:

class TimerActionListener implements ActionListener {
    public static int inst = 1;
    public void actionPerformed(ActionEvent e) {
        int id = inst++;
        System.out.println("Executing instance: " + id);
        try { Thread.sleep(3000); } catch (Exception e) {} //For sleep 3 seconds
        System.out.println("Instance: " + id + "done! ");
    }
}
...