我最近看到一个MVC java应用程序,其中main方法编写为:
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
View view = new View();
Model model = new Model();
Controller controller = new Controller(view, model);
controller.start();
}
});
}
这是否会让所有程序(包括模型和控制器,与 Swing 完全无关)运行直到代码在 AWT 事件调度线程而不是主线程中结束?
如果最后一个是真的,那么这对应用程序来说真的很糟糕,因为它会阻止 EDT 执行它需要的任务(例如,调度事件,因为模型可能正在计算其他任务)。这是对的吗?
有一个类似的old post(不是与此重复的)可以表明上面提到的代码是很好的实践,所以它让我更加困惑。
您显示的代码片段的目的是createSwing UI 和模型并将它们连接在一起。
没有 Swing 更新(就对用户输入的反应而言),因为在更新之前不能有任何用户输入run()
方法结束。
虽然您可以在主线程和 EDT 之间拆分这些任务(并且可能会在首次显示 UI 之前获得几毫秒的时间),但这也会使应用程序的设计变得复杂(多线程不是一个简单的主题),并且会导致代码库乱七八糟invokeLater()
来电。在有人证明有必要之前我不会这样做。
恕我直言,美国东部时间is任何 GUI 应用程序中的主线程。对用户输入的每个反应都在此线程中开始,并且 UI 的每次更新都必须在此线程中完成。
长时间运行的任务应该在后台线程中完成 - 这通常意味着任何需要超过几毫秒的任务。
如果创建模型需要几秒钟怎么办?
在这种情况下,我会尝试将模型创建分为两部分:
- 创建所需的最小部分,以便可以显示 UI。这应该在 EDT 中完成(因为无论如何用户都必须等待这部分的完成 - 在显示 UI 之前他无法与其交互)
- 在后台线程中执行剩余的长时间运行的部分。
如果无法做到这一点怎么办?(即在模型完全初始化之前,UI 无法显示)
在这种情况下,用户必须等待模型完成初始化,然后才能查看和使用 UI。所以这个初始化是在 EDT 还是在主线程上运行并不重要。因此,请使用更简单的解决方案:EDT 上的所有内容。
但是通过显示一个提示来提示用户您的应用程序正在启动启动画面
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)