2009-01-06 2 views
4

В последнее время я читал Filthy Rich Clients и заметил, что хотя версия Java равна 6, упоминания о параллельной платформе не упоминается. Итак, они говорят о java.util.Timer и javax.swing.Timer, но не о ExecutorService.ExecutorService vs Swing Timer

Я прочитал о преимуществах ExecutorService в вопросе «Java Timer vs ExecutorService» и решил использовать последнее по сравнению с первым. Но в книге рассказывается о javax.swing.Timer и его преимуществах быть специфическими для разработки Swing.

Итак, означает ли это, что для разработки Swing (анимационные кнопки и т. Д.) Javax.swing.Timer по-прежнему является лучшим выбором или есть соответствующий класс в новой параллельной платформе, которая его заменяет?

ответ

6

Хорошо, что таймер качания работает, по крайней мере, на EDT, поэтому вам не нужно обертывать все вызовы invokeLater. Он также хорошо связан с Swing, поскольку он использует Actions, ActionListeners и другие классы, связанные с Swing.

Я придерживаюсь Swing Timer для выполнения задач Swing и использую новый параллельный пакет для вещей, которые не связаны с обновлением GUI.

Посмотрите на Using Timers in Swing Applications, так как он может содержать больше информации для качания (извините) решение.

+1

Для считывания или обновления визуализированного компонента Swing вам необходимо использовать таймер Swing. Даже чтение текущего состояния или значения из компонента должно выполняться на EDT для детерминированных результатов. –

5

Я бы сказал, что для простых вещей, связанных с качелями, лучшим выбором является javax.swing.Timer из-за упомянутых преимуществ here.

Обратите внимание, что задача качелей таймера является выполняется в отправке события потоков. Это означает, что задача может безопасно управлять компонентами, но она также означает, что задача должна быть выполнена .

С другой стороны, если вам необходимо выполнить связанные или более сложные/длительные операции по обработке, не свинг, то ExecutorService очень надежен и, безусловно, путь.

1

Просто предложение, посвященное тому, что посоветовали bruno, один образец для использования превосходных утилит параллелизма Java 1.5+ без разрыва Swing - это сделать ваш ExecutorService все тяжелый подъем (как сказал Бруно), но как только это будет сделано, ExecutorService нить должна передавать взаимодействие с реальными компонентами пользовательского интерфейса на AWT тему в Runnable, используя один из:

  • javax.swing.SwingUtilities.invokeAndWait(Runnable doRun)
  • javax.swing.SwingUtilities.invokeLater(Runnable doRun)

Эти методы передают runnable, который должен выполняться потоком AWT.

+0

Я бы избежал invokeAndWait - это использование, скорее всего, приведет к взаимоблокировкам. –