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

时间:2018-05-10 13:58:16

标签: 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来关闭它。这将关闭它,但有更好的方法吗?警报也没有真正起作用,当我关闭程序时,警报框显示半秒钟,然后消失并让线程再次运行。

2 个答案:

答案 0 :(得分:3)

不要使用关机钩子。那是一种蛮力方法。而是使你的线程守护程序线程。只需将以下代码添加到您的班级

即可
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());

就是这样。

答案 1 :(得分:0)

像这样添加关闭钩子:

Runtime.getRuntime().addShutdownHook(new Thread(scheduler::shutdown))