我正在查看与此问题类似的示例。我们有一个 JavaFX 应用程序,它通过从以下线程运行的线程运行一些 GUI 更新:ScheduledExecutorService::scheduleAtFixedRate。
这与其他几个问题类似。我认为最像我的情况的两个是:
然而,我需要解决的问题是关于下一步的。我的目标是嵌入式应用程序,没有机会手动终止 JVM 任务或其他简单的答案等。我担心重启是为非常严重的事情保留的。
我们需要确保所有线程都有序关闭。我正在寻找某种回调或事件,让我注册一个清理例程来关闭我的东西?
我在想在基类 JavaFX 中应该有“东西”javafx.application.Application去做这件事。
当我的 FXMLController 停止时,我可以使用 Stop 方法还是可以注册调用它?
目前,当我从 Netbeans 运行我的 JavaFX 应用程序时,JVM 进程仍然存在。这将停止任何进一步的构建脚本并锁定 JAR 文件。 Netbeans 为您提供了终止任务的选项。真正的解决方案是应用程序/JVM 有序且整齐地关闭。
(update) ... 我查看了用于启动 JavaFX 应用程序的 javafx.Application 类。我实现了一个 Stop() 方法。在这里,我确保调用了 Platform.exit() ...
/////
// @see
// -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29
//
public void stop()
{
Platform.exit();
}
这并不能解决从 NetBeans 运行时的问题。有时您需要单击停止 [X] 按钮两次,但是当您使用终止按钮时进程确实停止了。如果您对进度感兴趣,请将其报告为错误:[Bug 245284] ,有一个小时钟示例来演示该问题。当您关闭窗口时,NetBeans 进程运行面板仍在“运行”。您无法构建,因为 JAR 文件已锁定。至少我们知道手动杀死开发程序。
- 欢迎提出建议。 . .
最佳答案
我有一个部分解决方案来解决陷入这种情况的开发人员。在您的 JavaFX 应用程序中声明一个 stop() 方法(Netbeans Maven JavaFX 模板称为“MainApp”)。当然有问题,但首先是方法。
在程序结束时调用 Stop。我接到了调用 Platform.exit() 的电话以关闭 JavaFX 运行时。我添加了一个调用来关闭其他 Activity 的 Executor 线程,我现在将其保存在一个列表中,以测试解决方案。
public class MainApp extends Application
{
@Override
public void start(Stage stage) throws Exception
{
.....
}
/**
* Close down the application
* @see
* -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29
**/
@Override
public void stop()
{
Platform.exit();
for( ScheduledExecutorService sched : activeExecutorServices )
{
sched.shutdown();
}
}
}//MainAppl class
因此,通过注释掉对关闭的调用并运行我的 JavaFX 程序,应用程序完成但不会退出,并且 Netbeans 显示正在运行的任务。您需要手动单击 Netbeans 中的终止按钮。
取消注释 shutdown() 调用。当 JavaFX 应用程序退出时,它也会从 Netbeans 运行的作业中消失。这似乎是一个决议。
剩下的问题:
- Platform.exit() 和shutdown() 之间的正确顺序是什么?
- 如果有多个 ScheduledExecutorService,使用哪个顺序关闭它们是否重要?后进先出还是先进先出?
- 有没有更好的方法?
- Netbeans 应该能够检测到“进程超限”并将其报告为问题。这至少让你我可以选择忽略它或修复程序。
希望这能帮助下一个面临类似问题的人:-)
关于java - 如何在 JavaFX Runtime 退出时终止计划的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451194/