【问题标题】:JavaFX 8 JVM remains after exitJavaFX 8 JVM 退出后仍然存在
【发布时间】:2014-12-29 10:16:36
【问题描述】:

我创建了一个 JavaFX 应用程序,并注意到在我关闭主阶段后,会发生以下情况:

  • 应用程序“停止”方法被调用
  • main方法继续
  • 程序离开main方法后,JVM无法关闭

我不创建任何线程(至少明确地不创建)。此时正在运行的线程是(来自调试控制台):

  • InvokeLaterDispatcher
  • Prism 字体处理器
  • 'pool-2-thread-1'(我不知道这是什么 - ThreadPoolExecutor 部件在它的堆栈跟踪中)
  • HSQLDB 计时器(我在开发/调试系统上使用 HSQLDB 文件 db)
  • FX 访问线程(可视化调试器)
  • 废弃的连接清理线程

哪些线程可以阻止 JVM 关闭?我认为所有这些都应该是守护线程......

这是我的应用程序代码:

public class MainApp extends Application {

@Override
public void start(Stage stage) throws Exception {       
    final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/Main.fxml"));
    Parent root = fxmlLoader.load();

    Scene scene = new Scene(root);
    scene.getStylesheets().add("/styles/Styles.css");

    //... Scene/stage setup here
    stage.show();
}

@Override
public void stop() throws Exception {
    super.stop();
}

public static void main(String[] args) {
    launch(args);
}
}

添加一个 System.exit(0);在 stop() 方法的最后解决了这个问题,但我不确定这是否是问题的最佳解决方案...... 有什么想法吗?

提前谢谢

【问题讨论】:

    标签: java multithreading jvm javafx-8


    【解决方案1】:

    您说您使用的是 HSQLDB,但您没有显示初始化它的代码。在您的 stop() 方法中,关闭该连接。

    【讨论】:

    • 我使用 JPA,我唯一存储的是 EntityManagerFactory,它是我使用 Persistence.createEntityManagerFactory() 创建的。这是个问题吗?
    • EntityManagerFactroy 有一个close() 方法,Javadoc 说:关闭工厂,释放它拥有的所有资源。工厂实例关闭后,对其调用的所有方法都将抛出 IllegalStateException,除了 isOpen,它将返回 false。一旦 EntityManagerFactory 被关闭,它的所有实体管理器都被认为处于关闭状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2021-11-02
    • 2017-03-06
    • 2017-06-08
    相关资源
    最近更新 更多