在Swing应用程序内部的javax.swing.Timer与java.util.Timer

FaN*_*NaJ 4 java swing timer event-dispatch-thread java-8

这是更好地javax.swing.Timer在swing应用程序内使用而不是使用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();
Run Code Online (Sandbox Code Playgroud)

要么

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

这两个有什么区别吗?

Bor*_*der 12

区别:

A java.util.Timer开始自己Thread运行任务.

A javax.swing.Timer计划在EDT上执行的任务.

现在.Swing是单线程的.

您必须仅从EDT访问和改变Swing组件.

因此,要每隔X秒更改一次GUI,请使用Swing计时器.要做后台业务逻辑,请使用其他计时器.或者更好一点ScheduledExecutorService.

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

  • @ user3767784这与性能无关.**完全**.仔细阅读我的回答.它正在EDT上工作,不属于导致滞后的EDT. (3认同)

Bit*_*nja 5

主要区别在于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);
Run Code Online (Sandbox Code Playgroud)