Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Javafx 8 - Fatal编程技术网

检查JavaFX平台是否正在退出

检查JavaFX平台是否正在退出,java,multithreading,javafx,javafx-8,Java,Multithreading,Javafx,Javafx 8,我使用的后台线程在JavaFX停止时不应立即停止(就像在使用setImplicitExit配置的任何阶段都不再打开时一样),因此我不使用setDaemon进行此操作。但是如何检查JavaFX是否正在关闭?(此线程应该只完成一些事情并自行停止) 我知道我可以将setOnCloseRequest放入所有阶段,但我不希望这样做 Runtime.getRuntime().addShutdownHook()在这种情况下不起作用,因为只要此线程正在运行,机器就不会停止运行)。覆盖应用程序。停止()并设置标志

我使用的后台线程在JavaFX停止时不应立即停止(就像在使用
setImplicitExit
配置的任何阶段都不再打开时一样),因此我不使用
setDaemon
进行此操作。但是如何检查JavaFX是否正在关闭?(此线程应该只完成一些事情并自行停止)

我知道我可以将
setOnCloseRequest
放入所有阶段,但我不希望这样做


Runtime.getRuntime().addShutdownHook()
在这种情况下不起作用,因为只要此线程正在运行,机器就不会停止运行)。

覆盖
应用程序。停止()
并设置标志。您的线程将需要定期检查该标志

SSCCE:

import java.util.concurrent.atomic.AtomicBoolean;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class ExitThreadGracefullyOnExit extends Application {

    AtomicBoolean shutdownRequested = new AtomicBoolean();

    @Override
    public void start(Stage primaryStage) {

        Label countLabel = new Label();

        Thread thread = new Thread(() -> {
            try {
                int count = 0 ;
                while (! shutdownRequested.get()) {
                    count++ ;
                    final String message = "Count = "+count ;
                    Platform.runLater(() -> countLabel.setText(message));
                    Thread.sleep(1000);
                }
                System.out.println("Shutdown... closing resources");
                Thread.sleep(1000);
                System.out.println("Almost done...");
                Thread.sleep(1000);
                System.out.println("Exiting thread");
            } catch (InterruptedException exc) {
                System.err.println("Unexpected Interruption");
            }
        });

        VBox root = new VBox(10, countLabel);
        root.setAlignment(Pos.CENTER);

        thread.start();

        Scene scene = new Scene(root, 350, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @Override
    public void stop() {
        shutdownRequested.set(true);
    }

    public static void main(String[] args) {
        launch(args);
    }
}

我认为您可以使用应用程序的
stop()
方法。