ExecutorService与Swing Timer

时间:2009-01-06 15:09:21

标签: java swing timer

我最近一直在阅读Filthy Rich Clients并注意到,虽然Java的版本是6,但没有提及并发框架。所以,他们谈论java.util.Timer和javax.swing.Timer,而不是关于ExecutorService。

我在问题“Java Timer vs ExecutorService”中读到了ExecutorService的优点,并决定将后者用于前者。但是这本书讨论了javax.swing.Timer,它具有特定于Swing开发的优势。

那么,这是否意味着,对于Swing开发(动画按钮等),javax.swing.Timer仍然是一个更好的选择,或者在新的Concurrent Framework中是否有相关的类替换它?

3 个答案:

答案 0 :(得分:6)

Swing Timer至少在EDT上运行,因此您不必通过调用invokeLater来包装所有内容。它还与Swing很好地结合,因为它使用了Actions,ActionListeners和其他与Swing相关的类。

我坚持使用Swing Timer进行Swing相关任务,并将新的并发包用于不涉及更新GUI的内容。

请查看Using Timers in Swing Applications,因为它可能包含更多信息(抱歉)。

答案 1 :(得分:5)

我会说,对于简单的摇摆相关的东西,更好的选择是javax.swing.Timer,因为提到的优势here

  

请注意,Swing计时器的任务是   在事件发送中执行   线。这意味着任务可以   安全地操纵组件,但它   也意味着任务应该   快速执行。

另一方面,如果您需要执行非摆动相关或更复杂/冗长的处理操作,ExecutorService非常强大,绝对是可行的方法。

答案 2 :(得分:1)

只是一个关于布鲁诺建议的一个建议,一个利用优秀的Java 1.5+并发实用程序而不破坏Swing的模式是让你的ExecutorService做所有繁重的工作(如布鲁诺所说)但是一旦这样做完成之后,ExecutorService线程应该使用以下方法之一将实际UI组件与Runnable中的AWT线程交互:

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

这些方法传递了由AWT线程执行的runnable。