启动需要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();
}
答案 0 :(得分:8)
你正处于正确的轨道上。希望这会让事情变得更加清晰......
Swing不是线程安全的。话虽这么说,你可以做几件事。一种选择是使用SwingUtilities
在要执行的事件调度线程上发布Runnable
任务。这将使您能够从数据库中检索数据,并在尊重Swing的单线程模型的同时在单独的线程中更新UI。
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
// update UI
}
});
另一个选项,因为这是一个长期运行的任务,就是使用SwingWorker
在完成或处理时为UI提供更新。
正如您所看到的,这两种机制(即SwingUtilities
和SwingWorker
)使您能够将这些任务专用于其他线程,同时为您提供放置结果的能力(通常转换为EventQueue
上的一个动作),以便以后(和安全)执行。无论您选择哪一个,重要的是要记住长期运行的任务绝不应该在EDT
中进行。因此,正如我发现的那样,任何精心设计的GUI的最重要特征是响应性。