【问题标题】:How to terminate a scheduled thread when JavaFX Runtime exits?JavaFX运行时退出时如何终止计划线程?
【发布时间】:2014-08-18 12:38:17
【问题描述】:

我正在查看与此问题类似的示例。我们有一个 JavaFX 应用程序,它通过以下线程运行一些 GUI 更新:ScheduledExecutorService::scheduleAtFixedRate

这与其他几个问题类似。我认为最像我的情况的两个是:

然而,我需要解决的问题是关于下一步。我的目标是嵌入式应用程序,没有机会手动终止 JVM 任务或其他简单的答案等。恐怕重新启动是为非常严重的事情保留的。

我们需要确保所有线程都被有序地关闭。我正在寻找某种回调或事件,让我注册一个 clean-up 例程来关闭我的 stuff

我在想应该在基类 JavaFX javafx.application.Application 中有“something”来做这件事。

Stop 方法是我可能使用的还是我可以注册以便在我的 FXMLController 停止时调用?

目前,当我从 Netbeans 运行我的 JavaFX 应用程序时,JVM 进程仍然存在。这将停止任何进一步的构建脚本并锁定 JAR 文件。 Netbeans 为您提供了终止任务的选项。真正的解决方案是应用程序/JVM 有序、整齐的关闭。

(update) ... 我查看了用于启动 JavaFX 应用程序的 javafx.Application 类。我实现了一个 Stop() 方法。在这里,我确保我调用了 Platformexit() ...

/////
//  @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 进程运行面板仍处于“running”状态。您无法构建,因为 JAR 文件已锁定。至少我们知道手动杀死开发程序。

  • 欢迎提出建议。 . .

【问题讨论】:

    标签: java multithreading javafx-2


    【解决方案1】:

    我有一个部分解决方案来覆盖陷入这种情况的其他开发人员。在您的 JavaFX 应用程序中声明一个 stop() 方法(Netbeans Maven JavaFX 模板称为“MainApp”)。当然有问题,但首先是方法。

    在程序结束时调用停止。我接到了调用 Platform.exit() 的电话以关闭 JavaFX 运行时。我添加了一个调用来关闭其他活动的 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 中的 kill-button。

    取消注释 shutdown() 调用。当 JavaFX 应用程序退出时,它也会从 Netbeans 运行的作业中消失。这似乎是一种重新定位。

    剩下的问题:

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

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

    【讨论】:

      【解决方案2】:

      你可以使用 setOnCloseRequest

      @Override
      public void start(Stage primaryStage) {
          primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
              @Override
              public void handle(WindowEvent event) {
                  ThreadPool.shutdown();
              }
          });
      
          initGui(primaryStage);
          initData();
      }
      

      【讨论】:

      • 只有在关闭阶段和退出应用程序完全相同的情况下才有效,并非所有应用程序都如此。
      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 2017-04-21
      • 1970-01-01
      • 2017-04-06
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多