Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当JavaFX运行时退出时,如何终止调度线程?_Java_Multithreading_Javafx 2 - Fatal编程技术网

当JavaFX运行时退出时,如何终止调度线程?

当JavaFX运行时退出时,如何终止调度线程?,java,multithreading,javafx-2,Java,Multithreading,Javafx 2,我正在研究这个问题的类似例子。我们有一个JavaFX应用程序,它通过以下线程运行一些GUI更新:ScheduledExecutorService::scheduleAtFixedRate 这与其他几个问题类似。我认为与我的处境最相似的两个方面是: 然而,我需要解决的问题是下一步。我的目标是一个嵌入式应用程序,没有机会手动终止JVM任务或其他简单的答案,等等。我担心重新启动是为了一些非常严重的事情 我们需要确保以有序的方式关闭所有线程。我要找的是某种回电或事件,让我注册一个清理程序来关闭我

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

这与其他几个问题类似。我认为与我的处境最相似的两个方面是:

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

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

我在想基类中应该有一些东西,JavaFX来完成这个任务

Stop方法是我可以使用的方法吗?或者当FXMLController停止时,我可以注册以调用它吗

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

更新)。。。我研究了用于启动javafx应用程序的javafx.Application类。我实现了一个Stop()方法。在这里,我确保我已经调用了平台退出()

这并不能解决从NetBeans运行时的问题。有时您需要单击停止[X]按钮两次,但当您使用kill按钮时,该过程确实会停止。如果您对进度感兴趣,可以将其报告为bug:,这里有一个小的时钟示例来演示这个问题。关闭窗口时,NetBeans进程运行面板仍在“运行”。无法生成,因为JAR文件已锁定。至少我们知道手动终止开发程序

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

  • 见:
在程序结束时调用Stop。我接到了呼叫平台的呼叫。退出()关闭JavaFX运行时。我添加了一个关闭其他活动执行器线程的调用,我现在将其保存在一个列表中,以测试解决方案

 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
因此,通过注释掉shutdown调用并运行我的JavaFX程序,应用程序完成但不会退出,Netbeans显示一个正在运行的任务。您需要手动单击Netbeans中的kill按钮

取消对shutdown()调用的注释。当JavaFX应用程序退出时,它也会从运行作业的Netbeans中显示。这似乎是一种再洗剂

其余问题:

  • 平台退出和关闭之间的正确顺序是什么
  • 对于多个ScheduledExecutorService,使用哪个顺序关闭它们是否重要?后进先出还是先出
  • 有更好的办法吗
  • Netbeans应该能够检测“进程溢出”并将其作为问题报告。这至少让你和我可以选择忽略它或修复程序
    希望这将有助于下一个面临类似问题的人:-)

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

    • 见:
    在程序结束时调用Stop。我接到了呼叫平台的呼叫。退出()关闭JavaFX运行时。我添加了一个关闭其他活动执行器线程的调用,我现在将其保存在一个列表中,以测试解决方案

     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
    
    因此,通过注释掉shutdown调用并运行我的JavaFX程序,应用程序完成但不会退出,Netbeans显示一个正在运行的任务。您需要手动单击Netbeans中的kill按钮

    取消对shutdown()调用的注释。当JavaFX应用程序退出时,它也会从运行作业的Netbeans中显示。这似乎是一种再洗剂

    其余问题:

  • 平台退出和关闭之间的正确顺序是什么
  • 对于多个ScheduledExecutorService,使用哪个顺序关闭它们是否重要?后进先出还是先出
  • 有更好的办法吗
  • Netbeans应该能够检测“进程溢出”并将其作为问题报告。这至少让你和我可以选择忽略它或修复程序
    希望这能帮助下一个面临类似问题的人:-)

    您可以使用setOnCloseRequest

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                ThreadPool.shutdown();
            }
        });
    
        initGui(primaryStage);
        initData();
    }
    
    @覆盖
    公共无效开始(阶段primaryStage){
    setOnCloseRequest(新的EventHandler()){
    @凌驾
    公共无效句柄(WindowEvent事件){
    ThreadPool.shutdown();
    }
    });
    initGui(初级阶段);
    initData();
    }
    
    您可以使用setOnCloseRequest

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent event) {
                ThreadPool.shutdown();
            }
        });
    
        initGui(primaryStage);
        initData();
    }
    
    @覆盖
    公共无效开始(阶段primaryStage){
    setOnCloseRequest(新的EventHandler()){
    @凌驾
    公共无效句柄(WindowEvent事件){
    ThreadPool.shutdown();
    }
    });
    initGui(初级阶段);
    initData();
    }
    
    只有在关闭后台和退出应用程序完全相同的情况下才有效,但这并不适用于所有应用程序。只有在以下情况下才有效