两者之间有什么区别:
//Some code, takes a bit of time to process
(new SomeJFrame()).setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
(new SomeJWindow()).start();//Start a new thread
}
});
和:
class doGraphics extends SwingWorker<Void, Object> {
@Override
public Void doInBackground() {
//Some code, takes a bit of time to process
(new SomeJFrame()).setVisible(true);
return null;
}
@Override
protected void done() {
(new SomeJWindow()).start();//Start a new thread
}
}
(new doGraphics()).execute();
哪种方法更好用?
SwingUtilities.invokeLater
获取一个 Runnable 并稍后在 UI 线程中调用它。通常用于短期运行的 UI 相关工作。
SwingWorker
在非 UI 线程 - 工作线程中运行主要工作。长时间运行的工作完成后,将在 ui 线程(事件调度线程)中调用 done()
方法。
但是 SwingWorker 的 doInBackground()
方法也可以通过调用 publish()
方法发布中间结果。SwingWorker
将确保要发布的结果由事件调度线程处理。可以通过实现 process()
方法挂钩。