如何在JavaFX Runtime退出时终止预定的线程?

时间:2014-06-27 11:53:54

标签: java multithreading javafx-2

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

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

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

我们需要确保所有线程都以有序的方式关闭。我正在寻找的是某种回调或事件,让我注册一个清理例程来关闭我的东西

我当时认为应该有 '在基类中,JavaFX javafx.application.Application来做行动。

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

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

update )...我查看了用于启动JavaFX应用程序的javafx.Application类。我实现了一个Stop()方法。在这里,我确保我称之为平台退出()......

/////
//  @see
//    -- http://docs.oracle.com/javafx/2/api/javafx/application/Application.html#stop%28%29
//
public void stop()
{
    Platform.exit();
}

从NetBeans运行时,这并不能解决问题。有时您需要单击stop [X]按钮两次,但是当您使用kill按钮时,该过程会停止。如果您对进度感兴趣,则会将其报告为错误:[Bug 245284],这是一个用于演示问题的小时钟示例。关闭窗口时,NetBeans流程运行面板仍然正在运行'。您无法构建,因为JAR文件已被锁定。至少我们知道手动杀死开发程序。

  • 欢迎提出建议。 。

2 个答案:

答案 0 :(得分:2)

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

在程序结束时调用Stop。我打电话给Platform。退出()来关闭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. 平台之间的正确顺序是什么。退出()和关闭()?
  2. 使用多个ScheduledExecutorService,关闭哪个订单关闭它们是否重要? LIFO还是FIFO?
  3. 有更好的方法吗?
  4. 应该Netbeans能够检测到“流程超限”并将此报告为问题。这至少让你和我可以忽略它或修复程序。
  5. Hopefyully将帮助下一个面临类似问题的人: - )

答案 1 :(得分:2)

你可以使用setOnCloseRequest

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

    initGui(primaryStage);
    initData();
}