我一直在读 肮脏的有钱客户 最近注意到,虽然Java的版本是6,但是并没有提到Concurrent Framework。因此,他们谈论 java.util.Timer 和 javax.swing.Timer,但没有谈论 ExecutorService。

我在问题中读到了 ExecutorService 的优点“Java Timer 与 ExecutorService”并决定使用后者而不是前者。但这本书讨论了 javax.swing.Timer 以及它专门针对 Swing 开发的优点。

那么,这是否意味着,对于 Swing 开发(动画按钮等),javax.swing.Timer 仍然是更好的选择,或者新的并发框架中是否有相关的类可以替代它?

有帮助吗?

解决方案

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

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

查看在Swing应用程序中使用计时器,因为它可能包含更多信息(抱歉)决定。

其他提示

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

  

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top