当前位置: 首页 > 知识库问答 >
问题:

当JavaFX运行时退出时,如何终止计划线程?

闻鹤龄
2023-03-14

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

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

  • JavaFX任务线程未终止

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

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

我在想基类JavaFX中应该有“东西”。应用申请签署契约。

  • http://docs.oracle.com/javafx/2/api/javafx/application/Application.html

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

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

(更新)。。。我查看了javafx。用于启动JavaFX应用程序的应用程序类。我实现了一个Stop()方法。在这里,我确保我已经给平台打了电话。退出()。。。

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

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

  • 欢迎您的建议

共有2个答案

仇睿
2023-03-14

您可以使用setOnCloseRequest

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

    initGui(primaryStage);
    initData();
}
司徒泰
2023-03-14

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

  • 请参阅:JavaFX应用程序

停止在程序结束时调用。我打电话给Platform.exit()关闭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

因此,通过注释掉关闭的调用并运行我的JavaFX程序,应用程序完成了但不会退出,Netbean显示了一个正在运行的任务。您需要手动单击Netbean中的杀死按钮。

取消注释关闭()调用。当JavaFX应用程序退出时,它也会从运行作业的Netbean中消失。这似乎是一种解脱。

剩下的问题是:

  1. 平台之间的正确顺序是什么。退出()和关机()

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

 类似资料:
  • 问题内容: 我有两个线程:主线程和从主线程生成的线程。 当主线程退出时,整个程序会终止吗? 问题答案: 没有。 当所有非守护程序线程完成时,Java程序终止。 该文档指出: Java虚拟机启动时,通常只有一个非守护程序线程(通常调用某些指定类的名为main的方法)。Java虚拟机将继续执行线程,直到发生以下任何一种情况: 类的方法已被调用,安全管理器已允许进行退出操作。 不是守护程序线程的所有线程

  • 根据文件:https://docs.python.org/3/library/threading.html 线程可以标记为“守护线程”。此标志的意义在于,当只剩下守护进程线程时,整个Python程序将退出。初始值从创建线程继承。可以通过daemon属性或daemon构造函数参数设置该标志。 示例代码: 参考许多其他StackOverflow答案,我不清楚当主线程调用时,守护线程是否被迫关闭

  • 我正在用Python制作一个图形游戏《谁想成为百万富翁》。我希望用户有45秒的时间回答每个问题。然而,每当我在代码中放置一个计时器时,它会先等待45秒,然后让用户回答,而不是在后台运行,同时让用户回答。

  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • motioncfp.java: