gpt4 book ai didi

java - 如何为我的代码启动一个线程,为 JavaFX 应用程序启动一个线程?

转载 作者:行者123 更新时间:2023-12-04 13:45:09 25 4
gpt4 key购买 nike

我正在尝试使用 JavaFX 运行程序。如果我使用的是 Swing,我会让一个类由 main 方法启动,并让它构建 GUI 类。这将给我 2 个线程,一个应用程序的普通线程和 EventQueue。这将防止阻止 UI 工作。

因此,我尝试让在静态 main 方法中创建的类构造 Application 类,然后启动它。我得到一个 RuntimeException,因为调用 launch 方法的程序不是 Application 的子类。

有没有办法分离线程,或者所有的东西都必须在给定应用程序类的线程内工作?

最佳答案

在 JavaFX 中,我猜想为了防止出现在许多 Swing 应用程序中的非常常见的线程错误,启动过程受到限制,因此(或多或少)唯一的​​做事方式迫使您执行FX 应用程序线程上的 UI 代码:

public class MyAppStartClass extends Application {

@Override
public void start(Stage primaryStage) {
// this method will be executed on the FX Application Thread

// load UI and display it here....
}

}

在 Oracle JRE 中,执行 java MyAppStartClass 将(与常规 Java 应用程序相反)导致创建 MyAppStartClass 实例,FX 应用程序线程将被启动,创建的实例的 start 方法在 FX Application Thread 上执行。 (还有更多内容,但这是基本要点。)

如果您想支持不知道如何执行 JavaFX 应用程序的环境(包括许多 IDE),您可以添加一个 main 方法来强制执行此操作,只需调用静态 Application.launch() 方法:

public class MyAppStartClass extends Application {

@Override
public void start(Stage primaryStage) {
// this method will be executed on the FX Application Thread

// load UI and display it here....
}

// to support non-JavaFX-aware environments:
public static void main(String[] args) {
launch(args);
}

}

请注意,launch 有一个重载形式,您可以在其中指定一个 Application 子类,这样您就可以拥有一个不同的主类(这种情况的用例很少):

public class MainClass {
public static void main(String[] args) {
Application.launch(MyAppStartClass.class, args);
}
}

launch 方法有两个重要特性需要注意:

  1. 每个 JVM 生命周期只能调用一次。第二次调用会抛出异常。
  2. 它将阻塞直到 JavaFX 平台退出。

如果你想让一个线程在 FX Application Thread 之外工作,最简单的方法是直接从 start 方法启动它:

public class MyAppStartClass extends Application {

@Override
public void start(Stage primaryStage) {

// start a background thread to do background stuff:

new Thread(() -> {
// background work...
}).start();


// UI work...
}

}

如果将其与 Swing 应用程序的标准启动进行比较:

public class MySwingApp {

public static void main(String[] args) {

SwingUtilities.invokeLater(() -> {
// UI work...
});

// background work...
}
}

与 Swing 相比,这个过程有点颠倒。在 Swing 中,您(应该)明确地让启动方法 (main) 指定 UI 在 AWT 事件分派(dispatch)线程上运行,并且您可以在执行 main 的“当前”线程中执行其他操作。在 JavaFX 中,启动方法 (start) 在 UI 线程上执行,如果您想在另一个线程上执行操作,您可以显式启动一个线程。

其他规则几乎相同:作为场景图一部分的 UI 元素只能在 UI 线程等上修改。注意 JavaFX 有一个特定的 concurrency API。用于在后台线程中管理任务并在 FX 应用程序线程上安排 UI 更新。

旁白:

理论上我想你可以这样做:

public class MainClass {
public static void main(String[] args) {
new Thread(() -> Application.launch(MyAppStartClass.class, args)).start();

// do "background thread" work here in the (now free) main thread
}
}

但由于该成语与通常的设置相去甚远,我不推荐它。特别要注意的是,您不应该直接在 Application 子类中使用这样的 main 方法,因为(我认为)Oracle JRE(或知道如何运行 JavaFX 应用程序的环境)可能会忽略 main 方法和只需按照本文顶部所述启动您的启动方法即可。

关于java - 如何为我的代码启动一个线程,为 JavaFX 应用程序启动一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com