我最近一直在阅读Filthy Rich Clients,并注意到,尽管Java6版本,但没有提到并发框架。所以,他们谈论的是java.util.Timer和javax.swing.Timer,而不是ExecutorService。
我在问题"Java Timer vs ExecutorService“中读到了ExecutorService的优点,并决定使用后者而不是前者。但这本书谈到了javax.swing.Timer及其特定于Swing开发的优势。
那么,这是否意味着,对于Swing开发(动画按钮等),javax.swing.Timer仍然是更好的选择,或者在新的并发框架中是否有相关的类来取代它?
发布于 2009-01-06 15:42:52
那么,Swing计时器至少可以在EDT上运行,所以您不必将所有内容都包装在对invokeLater的调用中。它还很好地绑定了Swing,因为它使用了Actions、ActionListeners和其他与Swing相关的类。
对于与Swing相关的任务,我会坚持使用Swing Timer,而对于不涉及更新GUI的任务,我会使用新的并发包。
看看Using Timers in Swing Applications,因为它可能包含更多信息来摆动(抱歉)决策。
发布于 2009-01-06 15:43:20
我会说,对于简单的swing相关的东西,更好的选择是javax.swing.Timer,因为上面提到了here的优点。
注意,Swing计时器的任务是在事件分派线程中执行的。这意味着该任务可以安全地操作组件,但这也意味着该任务应该快速执行。
另一方面,如果您需要执行与swing无关的或更复杂/冗长的处理操作,ExecutorService是非常健壮的,绝对是可行的。
发布于 2009-01-06 16:05:16
这只是一个建议,详细阐述布鲁诺的建议,在不破坏Swing的情况下利用优秀的Java 1.5+并发实用程序的一种模式是让您的ExecutorService完成所有繁重的工作(正如bruno所说的),但一旦完成,ExecutorService线程应该使用以下方法之一将与实际UI组件的交互传递给可运行的AWT线程:
javax.swing.SwingUtilities.invokeAndWait(Runnable doRun) javax.swing.SwingUtilities.invokeLater(Runnable doRun) 这些方法传递要由AWT线程执行的runnable。
https://stackoverflow.com/questions/416893
复制相似问题