如何设置 ScheduledExecutorService 在用户退出程序时结束?
How to set ScheduledExecutorService to end when user quits program?
我有一个 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 来关闭它。这将关闭它,但有更好的方法吗?警报也没有真正起作用,当我关闭程序时,警报框显示大约半秒钟,然后消失并再次离开线程 运行。
像这样添加关闭钩子:
Runtime.getRuntime().addShutdownHook(new Thread(scheduler::shutdown))
不要使用关闭挂钩。那是一种蛮力方法。而是让你的线程守护线程。只需将以下代码添加到您的 class
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());
就是这样。
我有一个 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 来关闭它。这将关闭它,但有更好的方法吗?警报也没有真正起作用,当我关闭程序时,警报框显示大约半秒钟,然后消失并再次离开线程 运行。
像这样添加关闭钩子:
Runtime.getRuntime().addShutdownHook(new Thread(scheduler::shutdown))
不要使用关闭挂钩。那是一种蛮力方法。而是让你的线程守护线程。只需将以下代码添加到您的 class
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());
就是这样。