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