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