javafx应用启动自动执行函数_在Shutdownhook上使用JavaFX Application.stop()方法

只有通过Platform.exit()退出应用程序时才会调用stop()(如果Platform.implicitExit为true,则关闭最后一个窗口).如果调用System.exit(),或者运行JVM的本机进程被中断(例如,类似* nix的OS上的ctrl-C),除了退出JavaFX应用程序的常用方法之外,还将执行关闭挂钩.

在FX应用程序线程上执行stop(),因此访问UI元素是安全的(例如,显示“保存未保存的更改”对话框等).关闭挂钩在后台线程中运行,因此无法访问UI元素(事实上FX Toolkit可能很久就会停止在该阶段运行).

所以选择取决于用例.

为了使这更具体,这是一个快速测试类:

import javafx.application.Application;

import javafx.application.Platform;

import javafx.geometry.Insets;

import javafx.geometry.Pos;

import javafx.scene.Scene;

import javafx.scene.control.Button;

import javafx.scene.layout.HBox;

import javafx.stage.Stage;

public class ShutdownTest extends Application {

@Override

public void start(Stage primaryStage) {

Button platformExit = new Button("Platform Exit");

platformExit.setOnAction(e -> Platform.exit());

Button systemExit = new Button("System Exit");

systemExit.setOnAction(e -> System.exit(0));

Button hang = new Button("Hang");

hang.setOnAction(e -> {while(true);});

HBox root = new HBox(5,platformExit,systemExit,hang);

root.setPadding(new Insets(20));

root.setAlignment(Pos.CENTER);

Scene scene = new Scene(root);

primaryStage.setScene(scene);

primaryStage.show();

}

@Override

public void stop() {

System.out.println("Stop");

}

public static void main(String[] args) {

Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("Shutdown hook")));

launch(args);

}

}

我在Mac OS X上测试了这个.

通过“平台退出”按钮退出,关闭窗口,或右键单击Dock并选择“退出”将同时执行stop()方法和关闭钩子.

通过“系统退出”按钮退出,通过强制进程从“活动监视器”退出,或者通过命令行中的kill id终止进程,将仅执行关闭挂钩.通过按“挂起”按钮然后右键单击Dock并选择“强制退出”来挂起应用程序具有相同的结果.

通过向进程发送SIGKILL退出(从命令行kill -9 id或kill -SIGKILL id)既不执行stop()方法也不执行shutdown hook.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值