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

Cof*_*fee 10 java swing timer

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

谢谢!

Vis*_*l K 31

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

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

java.util.Timer

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

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

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

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

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

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

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

  • @Adel你应该考虑使用Executor服务框架(如果是在Java 5或更高版本上)而不是java.util.Timer.如果您需要与GUI交互,请使用javax.swing.Timer但尝试避免使用它,因为它在GUI线程上运行(特别是对于冗长的操作).看看这个问题:[Java Timer vs ExecutorService](http://stackoverflow.com/questions/409932/java-timer-vs-executorservice) (5认同)