java - 如何在 JavaFX Runtime 退出时终止计划的线程?

标签 java multithreading javafx-2

我正在查看与此问题类似的示例。我们有一个 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 运行的作业中消失。这似乎是一个决议。

剩下的问题:

  1. Platform.exit() 和shutdown() 之间的正确顺序是什么?
  2. 如果有多个 ScheduledExecutorService,使用哪个顺序关闭它们是否重要?后进先出还是先进先出?
  3. 有没有更好的方法?
  4. Netbeans 应该能够检测到“进程超限”并将其报告为问题。这至少让你我可以选择忽略它或修复程序。

希望这能帮助下一个面临类似问题的人:-)

关于java - 如何在 JavaFX Runtime 退出时终止计划的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451194/

相关文章:

java - Servlet 映射无法正常工作

java - Gradle junit编码问题

java - 如何释放 Canvas 内存?

JavaFX 从 Controller 获取场景

JavaFX - 在 Chrome 浏览器中打开 URL

java - 数据库连接数与 Java 线程数

java - 将带有毫秒和时区的字符串转换为日期

java - 如何使 2 个服务器线程与 2 个客户端线程通信?

java - 我如何使用 wait/notifyAll

c - 指针和多线程中的错误预期为 ‘void * (*)(void *)’ 但参数的类型为 ‘pthread_t’