启动需要 5-10 秒从数据库检索初始数据的应用程序的正确方法是什么?这是我到目前为止所得到的,但我不确定是否有更好的方法。我希望 GUI 和数据库访问位于不同的线程中,以便 GUI 构建与数据检索同时发生。
public static void main(String[] args) {
final Controller controller = new Controller();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
View frame = new View();
controller.setView(frame);
}
});
Model model = new Model();
controller.setModel(model);
controller.getInitialData();
}
你走在正确的轨道上。希望这会让事情变得更加清楚......
Swing 不是线程安全的。话虽这么说,您可以做几件事。一种选择是使用SwingUtilities http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html发布一个Runnable
事件调度线程上要执行的任务。这将使您能够从数据库检索数据并在单独的线程中更新 UI,同时尊重 Swing 的单线程模型。
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
// update UI
}
});
由于这是一项长时间运行的任务,另一种选择是使用SwingWorker http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html在完成时或处理时向 UI 提供更新。
正如您所看到的,这两种机制(即SwingUtilities
and SwingWorker
)使您能够将此类任务专用于其他线程,同时使您能够将结果(通常转换为操作)放在EventQueue
以供稍后(且安全)执行。无论您选择哪一个,重要的是要记住,长时间运行的任务永远不应该在EDT
。因此,正如我所发现的,任何精心设计的 GUI 最重要的特征是反应能力.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)