为了账号安全,请及时绑定邮箱和手机立即绑定

难以理解何时执行关闭挂钩以及如何终止执行器服务

难以理解何时执行关闭挂钩以及如何终止执行器服务

郎朗坤 2022-09-22 20:04:59

我正在尝试运行一个基于 .我使用此服务来替换虚拟循环。全局思想是让首先让一个(调度程序)执行一个(可运行的)。然后,由于某种原因,可运行对象可能会或可能不会在其他任务(任务器)上计划任务。现在的问题是:scheduleAtFixedRateExecutorServicewhileExecutorServiceRunnableExecutorService

  • 当我停止程序时,我该如何停止所有这些线程?

我已经尝试了一下,找不到合适的解决方案。我尝试了两件事: ,守护进程线程不是我想要的,我希望调度程序继续运行,直到我停止程序。关闭钩子乍一看不是一个好的解决方案,但经过一些研究,它似乎有效。DaemonThreadShutdownHook

  • 我只是不明白为什么

问题是,如果我使用命令执行代码并使用 停止它,则会运行 ShutdownHook,但是如果我在 IDE(VScode) 中运行 java 代码并使用调试器工具停止它,则不会执行它。所以还有两个问题:mvn exec:java -Dexec.mainClass="com.goodbook.App"Ctrl+C

  • 为什么执行关机钩子

  • 为什么使用命令行运行和使用 IDE 运行之间的行为不同

首先,我将为您提供两段代码:应用程序和 Task 类。


查看完整描述

1 回答

?
慕丝7291255

TA贡献1500条经验 获得超6个赞

当 JVM 关闭时调用关闭挂钩;请参阅类 JavaDoc 在运行时.add.下载钩子.但是,从调试器终止运行并不是关闭。

常规退出

当最后一个非守护程序线程退出,或者通过代码调用System.exit(),或者在命令行上按CTRL-C(或者程序被发送一个终止信号,例如使用任务管理器),然后执行关闭钩子,一旦它们完成,JVM就会关闭。

退出调试器

如果在调试期间终止程序,然后按“停止”,IDE 将立即中止你的应用。没有机会运行关机挂钩。这通常是正确的做法;调试时,您通常只想杀死正在运行的任何内容。

调试时正常退出

如果你想要一种在调试时运行关机钩子的方法,有很多方法;一种是通过代码调用系统退出();这将触发钩子。在这个相关的问题中,他们等待按键事件,然后再调用 system.exit。


关于

当我停止程序时,我应该如何停止所有这些线程?

同样,您可以调用 System.exit(), 这样即使非 deamon 线程处于执行过程中(这并不干净),程序也会终止;但更好的方法是给每个线程一个正常终止的通道 - 例如。如果线程正在运行无限循环,它可以定期检查(易失性)变量,并在变量设置时返回(通过代码)。(变量本身应由关机挂钩设置)shutdownshutdown


查看完整回答
反对 回复 4天前

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信