stop()仅当您通过退出应用程序时
Platform.exit()(或如果最后一个窗口
Platform.implicitExit为true
则关闭了该窗口时),
才会调用。
System.exit()除了退出JavaFX应用程序的常规方法外,如果调用shutdown挂钩,或者如果运行JVM的本机进程被中断(例如,在*
nix之类的OS上的ctrl-C),则将执行关闭挂钩。
请注意,在调用之前在主线程中注册关闭挂钩似乎很重要
Application.launch()。
stop()是在FX Application
Thread上执行的,因此可以安全地访问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()方法和关闭挂钩。
通过“系统退出”按钮退出,通过强制进程从“活动监视器”退出或通过
killid从命令行终止进程,将仅执行关闭挂钩。通过按“挂起”按钮然后右键单击Dock并选择“强制退出”来挂起应用程序具有相同的结果。
通过将SIGKILL发送到进程(
kill -9 id或
kill -SIGKILLid从命令行)退出,既不会执行
stop()方法,也不会执行关闭钩子。



