java - 如何设置 ScheduledExecutorService 在用户退出程序时结束?

标签 java multithreading javafx alert scheduledexecutorservice

我有一个 ScheduledExecutorService,我将 Runnable 传递给它。如果该线程所针对的 Enemy 对象死亡,我将使用 .shutDown() 结束该线程,这工作得很好。但是,如果用户退出程序,线程仍然运行。发生这种情况时如何关闭它?

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    scheduler.scheduleAtFixedRate(runnable, 2,2, TimeUnit.SECONDS);


Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("SHOOT");
    }
};

现在我正在从应用程序中覆盖我的 Main 中的 stop() 方法。

@Override
public void stop() throws Exception {

    Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Exit ?", ButtonType.YES, ButtonType.NO);
    alert.show();

    if (alert.getResult() == ButtonType.YES) {
        //this works if put outside of alert
        BlueSlime.scheduler.shutdown();
        super.stop();
    }

    if(alert.getResult() == ButtonType.NO){
        System.out.println("No");
    }

通过使调度程序静态化,我可以通过从 Main 引用 BlueSLime 来关闭它。这将关闭它,但有更好的方法吗?警报也没有真正起作用,当我关闭程序时,警报框显示大约半秒钟,然后消失并让线程再次运行。

最佳答案

不要使用关闭钩子(Hook)。那是一种蛮力方法。而是让你的线程守护线程。只需将以下代码添加到您的类中即可

private static class DaemonThreadFactory implements ThreadFactory {
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setDaemon(true);
        return thread;
    }
}

然后将上面的第一行代码更改为

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, new DaemonThreadFactory());

就是这样。

关于java - 如何设置 ScheduledExecutorService 在用户退出程序时结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50274663/

相关文章:

java - 如何通过 setProperty 通过代理使用 HttpsURLConnection?

java - 如何在客户端服务器多线程中停止服务器

c++ - 终止工作线程和主线程之间的竞争条件

JavaFX 的 Spinner 在输入空文本时引发 NullPointerException

java - 如何使用 PrinteJob 打印 .doc 文件?

java - 在 Karaf OSGI 中,我收到抛出异常的包中的类的 ClassNotFoundException

python - 在线程中捕获中断的系统调用

image - 在 JavaFX HTMLeditor 中设置本地镜像

Javafx 使用日期选择器

java - 应用程序、远程脚本和安全/混淆