为什么Java中有两个Timer类(一个在javax.swing下,一个在java.util下)?

我真的很困惑。 Java有两个Timer类,一个在swing下,一个在util下……为什么呢? 如果我想每Y秒运行一次X,我应该使用哪一个? 这是否意味着如果我正在构建GUI我必须使用swing版本来定时器?

谢谢!

这是javax.swing.Timer和java.util.Timer之间的区别:

javax.swing.Timer 
  • 适用于更简单的情况,使用少量的定时器(比如少于十几个)
  • 在事件派发线程上运行ActionListener对象
  • 可以直接更新GUI,而无需使用EventQueue.invokeLater
  • 如果任务完全在事件调度线程中运行(即,如果它不生成工作线程),那么只有当任务不需要很长时间(比如300毫秒以下)时,GUI才会保持响应

java.util.Timer

  • 比javax.swing.Timer更具可伸缩性,并具有其他调度function
  • 在私有线程上运行TimerTask对象
  • 需要使用EventQueue.invokeLater来更新GUI

您可以通过两种方式使用Swing计时器:

  • 在延迟之后执行一次任务。 例如,工具提示管理器使用Swing计时器来确定何时显示工具提示以及何时隐藏它。
  • 反复执行任务。 例如,您可以执行动画或更新显示目标进度的组件。

以下是上述信息的来源http://www.javapractices.com/topic/TopicAction.do?Id=160和http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

如果我想每Y秒运行一次X,我应该使用哪一个?

取决于您与之交互的内容。 如果您正在与GUI交互,则使用javax.swing.Timer ,否则使用java.util.Timer

这是否意味着如果我正在构建GUI我必须使用swing版本来定时器?

Swing版本用于渲染swing组件。 如果你只需要时间,请使用util。

你是对的。 如果你打算做一个受定时器影响的UI工作,你应该使用swing组件。 util计时器无法自行设置UI元素。 这是一个很好的比较 。

在v 1.3中,另一个Timer类被添加到Java平台:java.util.Timer。 它和javax.swing.Timer都提供相同的基本function,但java.util.Timer更通用,并且具有更多function。 javax.swing.Timer有两个function,可以使它更容易使用GUI。 首先,它的事件处理隐喻对于GUI程序员来说是熟悉的,并且可以使事件调度线程的处理更简单一些。 其次,它的自动线程共享意味着您不必采取特殊步骤来避免产生太multithreading。 相反,您的计时器使用相同的线程来使光标闪烁,出现工具提示,等等。

您可以通过访问The Java Tutorial中的How to Use Timers这一部分找到更多文档和几个使用计时器的示例。 有关在此Timer类和java.util.Timer之间进行选择的更多示例和帮助,请参阅Swing应用程序中的使用计时器,这是Swing Connection中的一篇文章。

从官方文档 。

如果你有一个简单,快速的任务需要与swing框架交互,那么使用javax.swing.Timer更简单

对于几乎所有其他情况 – 甚至GUI应用程序你都应该使用java.util.Timer如果你有一个GUI,那么你必须处理与swing事件调度线程的集成,就像使用EventQueue.invokeLater更新GUI时任何其他任务一样正如刚才提到的

通常,当您启动时,前几个计时器事件可能看起来很快并且不太可能影响性能,但随着需求的变化,它们将花费更长时间,并且会出现更多,并且GUI本身的需求将会增长。 通过在swing环境之外启动来避免返工是一种更好的做法 – 否则你的GUI会很快显得“迟钝”或“无法使用”