Как настроить ScheduledExecutorService, чтобы он завершался, когда пользователь выходит из программы? - PullRequest
0 голосов
/ 10 мая 2018

У меня есть служба 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");
    }
};

Прямо сейчас я переопределяю метод 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");
    }

Делая планировщик статическимЯ могу закрыть его, ссылаясь на BlueSLime из Main.Это отключит его, но есть ли лучший способ?Также Alert не работает, когда я закрываю программу, окно Alert показывается примерно полсекунды и исчезает, а потоки снова запускаются.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Не используйте отключающий крюк. Это метод грубой силы. Вместо этого сделайте ваши темы демоническими. Просто добавьте следующий код в ваш класс

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

Вот и все.

0 голосов
/ 10 мая 2018

Добавьте отключающий крюк так:

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

...