ExecutorService против таймера качания
Вопрос
я читал Невероятно богатые клиенты недавно и заметил, что хотя версия Java 6, о Concurrent Framework нет упоминания.Итак, они говорят о java.util.Timer и javax.swing.Timer, но не о ExecutorService.
О преимуществах ExecutorService я прочитал в вопросе "Java-таймер против ExecutorService" и решил использовать второе вместо первого.Но в книге говорится о javax.swing.Timer и о его преимуществах, связанных с разработкой Swing.
Итак, означает ли это, что для разработки Swing (анимация кнопок и т. д.) javax.swing.Timer по-прежнему является лучшим выбором или в новой Concurrent Framework есть соответствующий класс, который его заменяет?
Решение
Ну, по крайней мере, Swing Timer работает на EDT, так что вам не нужно все оборачивать вызовами invokeLater. Он также хорошо связан с Swing, так как использует Actions, ActionListeners и другие связанные с Swing классы.
Я бы придерживался Swing Timer для задач, связанных с Swing, и использовал бы новый параллельный пакет для вещей, которые не требуют обновления графического интерфейса.
Ознакомьтесь с использованием таймеров в приложениях Swing . может содержать больше информации, чтобы отклонить (извините) решение.
Другие советы
Я бы сказал, что для простых вещей, связанных с колебаниями, лучшим выбором является javax.swing.Timer
из-за упомянутых преимуществ здесь .
Обратите внимание, что задача таймера Swing выполняется в событии отправки нить. Это означает, что задача может безопасно манипулировать компонентами, но это также означает, что задача должна выполнить быстро.
С другой стороны, если вам нужно выполнить не связанные с колебанием или более сложные / длительные операции обработки, ExecutorService
очень надежен и определенно подходит.
Просто предложение, развивающее то, что советовал Бруно: один из способов использования превосходных утилит параллельного выполнения Java 1.5+ без нарушения Swing — это ExecutorService
делать всю тяжелую работу (как сказал Бруно), но как только это будет сделано, ExecutorService
поток должен передать взаимодействие с фактическими компонентами пользовательского интерфейса потоку AWT в Runnable, используя один из:
javax.swing.SwingUtilities.invokeAndWait(Runnable doRun)
javax.swing.SwingUtilities.invokeLater(Runnable doRun)
Эти методы передают исполняемый файл для выполнения потоком AWT.