java - 用户退出程序时如何设置 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");
}
};
现在我正在stop()
从应用程序中覆盖我的 Main 中的方法。
@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 来关闭它。这将关闭它,但有更好的方法吗?警报也不起作用,当我关闭程序时,警报框会显示半秒钟,然后消失并让线程再次运行。
解决方案
不要使用关闭挂钩。那是蛮力的方法。而是让你的线程守护线程。只需将以下代码添加到您的课程中
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());
就是这样。
推荐阅读
- javascript - VSCode 没有为本地链接包显示正确的导入建议
- go - 在 Go 中使用 Cobra 和 Viper 配置默认目录路径
- python - 如何编写 Python 代码来查找 Pandas DF 中特定行值的列值的总和?
- powershell - 如何在 url 中使用带有一些括号的 Invoke-Webrequest?
- c++ - 如何在 C++ 中将一个字符串分成多个字符串?
- c# - 如何在c#中返回列表列表?
- arrays - 没有括号的Delphi json数组
- google-cloud-platform - GCP 跨多个 Compute Engine 检查服务状态
- r - Shiny 应用程序中的 DT:使用 UP 和 DOWN 键盘按钮一次选择一行
- python - 如何使用 python、selenium、pyvirtualdisplay 点击打开一个新窗口?