JavaFX应用程序在System.exit()之后不终止

JavaFX应用程序在System.exit()之后不终止,java,javafx,exit,terminate,Java,Javafx,Exit,Terminate,我有一个JavaFX应用程序,有时需要运行单独的进程(更新程序可执行文件)并终止。 我使用ProcessBuilder.command()运行一个单独的进程,并观察子进程何时变成!isAlive()这意味着进程将完全运行。在此之后,我试图通过运行Window.getWindows().forEach(::dispose)和System.exit(0)来终止应用程序 调用System.exit(0)后,应用程序挂起,但若并没有单独的进程运行,则应用程序将正确终止 以下是主线程堆栈跟踪的一部分: “

我有一个JavaFX应用程序,有时需要运行单独的进程(更新程序可执行文件)并终止。 我使用
ProcessBuilder.command()
运行一个单独的进程,并观察子进程何时变成
!isAlive()
这意味着进程将完全运行。在此之后,我试图通过运行
Window.getWindows().forEach(::dispose)
System.exit(0)
来终止应用程序

调用
System.exit(0)
后,应用程序挂起,但若并没有单独的进程运行,则应用程序将正确终止

以下是主线程堆栈跟踪的一部分:

“JavaFX应用程序线程”#32优先级=5 os_优先级=0 对象中的tid=0x000000001f4fe000 nid=0x44d0。等待() [0x0000000023f4d000]java.lang.Thread.State:正在等待(在对象上) 位于java.lang.Object.wait(本机方法)的 join(Thread.java:1252) -在java.lang.Thread.join(Thread.java:1326)处锁定(一个java.lang.Thread) java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:106) 在 java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:46) 位于java.lang.Shutdown.runHooks(Shutdown.java:123) sequence(Shutdown.java:167)位于 java.lang.Shutdown.exit(Shutdown.java:212) -在java.lang.Runtime.exit(Runtime.java:109)处锁定(java.lang.Shutdown的java.lang.Class) java.lang.System.exit(System.java:971)

因此,应用程序似乎在等待一些
应用程序关闭挂钩
完成。
应用程序中添加了两个钩子,但移除它们后,stacktrace保持不变

可以隐式添加哪些挂钩?也许单独的流程应该以不同的方式运行,以便能够在子流程关闭之前关闭


UPD:这个应用程序实际上不是一个完整的JavaFX应用程序,而是一个带有JavaFX部分的AWT应用程序。

您的应用程序仍然在等待所有关闭钩子完成,我希望仍然有一些钩子

runHooks
方法在应用程序退出时自动运行。应用程序将在完成后退出(除此之外,它还执行其他一些清理)。请参阅下面的代码:

static void runHooks() {
    Collection<Thread> threads;
    synchronized(ApplicationShutdownHooks.class) {
        threads = hooks.keySet();
        hooks = null;
    }

    for (Thread hook : threads) {
        hook.start();
    }
    for (Thread hook : threads) {
        try {
            hook.join();
        } catch (InterruptedException x) { }
    }
}
这个数字是对象的唯一数字(我认为是虚拟内存地址)。这个数字应该在应用程序的完整线程转储中,如果不是,您可以使用调试器在包含所有关闭挂钩的集合中查找对象(
java.lang.ApplicationShutdownHooks#hooks

在此之后,您可以查看此线程以了解它在等待什么


请注意,您使用的某些库可能会添加关闭钩子,而不仅仅是您自己的钩子

问题在于应用程序结构。 它实际上是一个Swing/AWT应用程序,手工启动了JavaFX组件。因此,当调用
Platform.exit()
Systen.exit(0)
时,AWT窗口将保持活动状态,并防止应用程序完全终止。 在这种情况下,需要正确处理活动AWT窗口,然后调用
Platform.exit()

然后调用Platform.exit()关闭应用程序的JavaFX部分

    at java.lang.Thread.join(Thread.java:1252)
    - locked <0x00000006c21ac608> (a java.lang.Thread)
    at java.lang.Thread.join(Thread.java:1326)
 window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 window.dispose();
 Platform.exit()