JavaFX应用程序在System.exit()之后不终止
我有一个JavaFX应用程序,有时需要运行单独的进程(更新程序可执行文件)并终止。 我使用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)后,应用程序挂起,但若并没有单独的进程运行,则应用程序将正确终止 以下是主线程堆栈跟踪的一部分: “
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()