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

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

这两个有什么区别吗?

区别:

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

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

现在。 Swing是单线程的

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

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

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

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