4

我最近一直在阅读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 仍然是更好的选择,或者新的并发框架中是否有相关的类来替代它?

4

3 回答 3

6

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

对于与 Swing 相关的任务,我会坚持使用 Swing Timer,并将新的并发包用于不涉及更新 GUI 的事情。

看看在 Swing 应用程序中使用计时器,因为它可能包含更多信息来做出决定(对不起)。

于 2009-01-06T15:42:51.690 回答
5

我想说,对于简单的挥杆相关的东西,更好的选择是因为这里javax.swing.Timer提到的优点。

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

另一方面,如果您需要执行非 Swing 相关或更复杂/冗长的处理操作,ExecutorService则非常健壮,绝对是要走的路。

于 2009-01-06T15:43:19.723 回答
1

只是一个详细说明 bruno 建议的建议,在不破坏 Swing 的情况下利用出色的 Java 1.5+ 并发实用程序的一种模式是让您ExecutorService完成所有繁重的工作(如 bruno 所说),但一旦完成,ExecutorService线程应该移交使用以下之一与 Runnable 中的 AWT 线程的实际 UI 组件交互:

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

这些方法传递可运行对象以由 AWT 线程执行。

于 2009-01-06T16:05:16.403 回答