我正在尝试运行一个基于 .我使用此服务来替换虚拟循环。全局思想是让首先让一个(调度程序)执行一个(可运行的)。然后,由于某种原因,可运行对象可能会或可能不会在其他任务(任务器)上计划任务。现在的问题是:scheduleAtFixedRateExecutorServicewhileExecutorServiceRunnableExecutorService当我停止程序时,我该如何停止所有这些线程?我已经尝试了一下,找不到合适的解决方案。我尝试了两件事: ,守护进程线程不是我想要的,我希望调度程序继续运行,直到我停止程序。关闭钩子乍一看不是一个好的解决方案,但经过一些研究,它似乎有效。DaemonThreadShutdownHook我只是不明白为什么。问题是,如果我使用命令执行代码并使用 停止它,则会运行 ShutdownHook,但是如果我在 IDE(VScode) 中运行 java 代码并使用调试器工具停止它,则不会执行它。所以还有两个问题:mvn exec:java -Dexec.mainClass="com.goodbook.App"Ctrl+C为什么执行关机钩子?为什么使用命令行运行和使用 IDE 运行之间的行为不同首先,我将为您提供两段代码:应用程序和 Task 类。
1 回答

慕丝7291255
TA贡献1859条经验 获得超6个赞
当 JVM 关闭时调用关闭挂钩;请参阅类 JavaDoc 在运行时.add.下载钩子
.但是,从调试器终止运行并不是关闭。
常规退出
当最后一个非守护程序线程退出,或者通过代码调用System.exit(),
或者在命令行上按CTRL-C(或者程序被发送一个终止信号,例如使用任务管理器),然后执行关闭钩子,一旦它们完成,JVM就会关闭。
退出调试器
如果在调试期间终止程序,然后按“停止”,IDE 将立即中止你的应用。没有机会运行关机挂钩。这通常是正确的做法;调试时,您通常只想杀死正在运行的任何内容。
调试时正常退出
如果你想要一种在调试时运行关机钩子的方法,有很多方法;一种是通过代码调用系统退出()
;这将触发钩子。在这个相关的问题中,他们等待按键事件,然后再调用 system.exit。
关于
当我停止程序时,我应该如何停止所有这些线程?
同样,您可以调用 System.exit(),
这样即使非 deamon 线程处于执行过程中(这并不干净),程序也会终止;但更好的方法是给每个线程一个正常终止的通道 - 例如。如果线程正在运行无限循环,它可以定期检查(易失性)变量,并在变量设置时返回(通过代码)。(变量本身应由关机挂钩设置)shutdown
shutdown
添加回答
举报
0/150
提交
取消