java - JavaFX-Launcher 中的循环阻止 JavaFX 应用程序线程启动

标签 java multithreading loops javafx javafx-2

如果您在JavaFX-Launcher Thread中放置无限循环,您的应用程序将永远不会启动。据我所知,它在不同的线程上运行,那么为什么会发生这种情况呢?

只需创建一个新项目并覆盖 init() 并添加一个永远循环。

// Mine is not forever
boolean go = true;

@Override
public void init() throws Exception {

    // TODO Auto-generated method stub
    super.init(); // 'while' comes after this line

    while(go){} // Comment this guy and everything is ayt
}

@Override
public void stop() throws Exception {

    // TODO Auto-generated method stub
    go = false;
    super.stop();
}

这是否意味着 JavaFX-Launcher Thread 应在应用程序 UI 启动之前退出(即 javaFxApplication 线程),或者我遗漏了某些内容?

如果JavaFX-Launcher应该是在应用程序启动之前启动应用程序需要的替代方案,为什么它不能并发,因为如果我希望它在我只需将代码放在 super.init() 方法之前?

最佳答案

直接解释正在发生的事情

应用程序的文档 start方法明确说明正在发生的事情:

The start method is called after the init method has returned, and after the system is ready for the application to begin running.

因此,如果您在 init 方法中运行一个永远不会返回的无限循环,您的应用程序将永远不会启动。

有关应用程序生命周期的更多文档位于 Application javadoc。

一些旁白、猜测和可能相关的信息

以下信息可能与您当前的问题相关,也可能无关。

我相信 init 方法背后的想法是,您可以将逻辑放入 init 方法中,该方法可以在 JavaFX 系统本身初始化时执行。 JavaFX 系统的初始化需要一定的时间,但在现代处理系统上,我预计这不会是很长的时间(例如不到一秒)。

我见过的大多数 JavaFX 应用程序都没有太多使用 init方法。

如果您的初始化很长,并且您希望应用程序在初始化完成之前快速启动,您将需要一些显式逻辑来处理该问题。

例如,创建 JavaFX Task在您自己的线程上运行的 init 方法中。在那里执行初始化。在您的启动方法中立即显示一个 UI,但功能有限。初始化完全完成后(监听器可以了解初始化任务的状态),然后启用依赖于初始化数据完全可用的全功能 UI。尽管不完全相同(因为它从启动而不是初始化运行一些任务逻辑),但此方法的一个非常相似的示例在此要点示例中,即“Displays a JavaFX splash page for an intensive startup task with progress monitoring ”。

JavaFX 确实有 Preloader 的概念它提供了一个内置框架来处理冗长的初始化,但是我还没有看到它被广泛使用。 Preloader 本身主要针对通过插件或 Java Web Start 嵌入网页中的 Java。这些并不是与 JavaFX 结合使用较多的技术。大多数 JavaFX 应用程序都是独立应用程序,不依赖网页插件或 Web 启动来执行。您可以使用预加载器框架来初始化应用程序(即使它在独立模式下工作),但为此目的使用任务可能更简单。有关Preloader使用的更多信息,可以引用:How to use javaFX Preloader with stand-alone application in Eclipse? (请注意,尽管问题是针对 Eclipse,但答案并不是特定于 Eclipse 的)。

关于java - JavaFX-Launcher 中的循环阻止 JavaFX 应用程序线程启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32915971/

相关文章:

java - 在 Nutch 中为自定义插件添加属性文件

java - 将图像 url 存储在共享首选项中并在 Recyclerview 中显示它们

java - 为什么用java日历解析时会得到错误的月份

c# - Thread.Sleep(300) 无法正常工作

Python 将具有偶然模式的列表中的元素提取到元组中

jquery - 如何制作jquery无限动画?

java - 如何销毁Kotlin中的单例对象并强制调用init block

java - 为什么我的 Swing 主线程死掉了?

c# - 如何使用 NAudio 将声音文件加载到内存中并在以后使用?

python - while 循环即使条件为 false,仍会再循环一次