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

时间:2014-07-29 22:02:08

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

最好在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);

这两者有什么区别吗?

2 个答案:

答案 0 :(得分:10)

区别:

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

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

现在。 Swing是单线程的

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

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

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

答案 1 :(得分:4)

主要区别在于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);