【问题标题】:javax.swing.Timer vs java.util.Timer inside of a Swing applicationSwing 应用程序中的 javax.swing.Timer 与 java.util.Timer
【发布时间】:2014-07-29 22:02:08
【问题描述】:

在 Swing 应用程序中使用 javax.swing.Timer 是否比使用 java.util.Timer 更好?

例如:

Timer timer = new Timer(1000, e -> label.setText(new Date().toString()));
    timer.setCoalesce(true);
    timer.setRepeats(true);
    timer.setInitialDelay(0);
    timer.start();

new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            label.setText(new Date().toString());
        }
    }, 0, 1000);

这两者有什么区别吗?

【问题讨论】:

  • Yes.
  • javax.swing.TimerEDT 上运行,因此应与Swing 组件一起使用。
  • Swing Timer 还允许合并计时器事件,这意味着如果事件队列中存在“计时器事件”,则在处理之前不会引发新事件,这可以防止事件队列的饱和可能导致性能不佳
  • 您通常应该避免使用java.util.Timer,因为它有一定的限制。如果您确实需要安排非 UI 后台任务,请使用 ScheduledExecutorService,因为它是与其他并发工具协调的更通用的解决方案。

标签: java swing timer java-8 event-dispatch-thread


【解决方案1】:

区别:

java.util.Timer 启动自己的 Thread 以运行任务。

javax.swing.Timer 安排任务在EDT 上执行。

现在。 Swing 是单线程的

您只能从 EDT 访问和改变 Swing 组件。

因此,要每 X 秒更改一次 GUI,请使用 Swing 计时器。要执行后台业务逻辑,请使用其他计时器。或者更好的是ScheduledExecutorService

记住一件非常重要的事情;如果你花时间在 EDT 上,它就不能花时间更新 GUI。

【讨论】:

  • 哪一个性能更好? java.util.Timer 还是 javax.swing.Timer? (我的意思是没有滞后)
  • @user3767784 这与性能无关。 完全。更仔细地阅读我的答案。它正在处理不属于导致延迟的 EDT 的 EDT。
【解决方案2】:

主要区别在于 javax.swing.Timer 在 EDT 上运行其代码,而 java.util.timer 在单独的线程上运行。因此,如果您以任何方式操作 GUI,最好使用摆动计时器。虽然如果您更喜欢使用不同类型的计时器,那么您仍然可以在 EDT 上调用您的代码。

new java.util.Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            label.setText(new Date().toString());
        }
    });
}, 0, 1000);

【讨论】:

  • 请注意,Swing Timer 还允许合并计时器事件,这意味着如果事件队列中存在“计时器事件”,则在处理之前不会引发新事件,这可以防止事件队列的饱和导致性能下降,而您的示例没有...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2011-06-04
  • 2015-07-23
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多