如何让Java处理系统中断,如Ctrl+;C

如何让Java处理系统中断,如Ctrl+;C,java,interrupt-handling,Java,Interrupt Handling,我有一个java程序,它创建了一个锁文件,以确保没有其他执行与它同时运行。如果程序运行,它将创建该文件,退出后(成功或通过异常),该文件将被删除。但是如果用户点击Ctrl+C,关闭终端,或者以其他方式中断执行,文件不会被删除。是否有任何方法可以检测此中断命令并确保在这种情况下文件也被删除?您可能需要查看 此外,这可能与前一两天的SO问题重复或接近重复: 处理这个问题的唯一好方法是给日志文件加上时间戳,并每隔几秒钟用新的时间戳更新日志文件。File.deleteOnExit会有所帮助,但没有一种方

我有一个java程序,它创建了一个锁文件,以确保没有其他执行与它同时运行。如果程序运行,它将创建该文件,退出后(成功或通过异常),该文件将被删除。但是如果用户点击Ctrl+C,关闭终端,或者以其他方式中断执行,文件不会被删除。是否有任何方法可以检测此中断命令并确保在这种情况下文件也被删除?

您可能需要查看

此外,这可能与前一两天的SO问题重复或接近重复:


处理这个问题的唯一好方法是给日志文件加上时间戳,并每隔几秒钟用新的时间戳更新日志文件。File.deleteOnExit会有所帮助,但没有一种方法是万无一失的(当有人拉电源线时会发生什么?)


如果您写了一个时间戳,那么您可以检查一个有效的时间戳(最近写的),并在日志文件严重过时时覆盖它。这样,过时的锁文件就不会妨碍用户。

当JVM异常终止时,是否会运行关闭挂钩?我会怀疑的。@mmyers,这取决于你对异常的定义。:)Ctrl-C通常会触发它们。关闭终端通常不会。没有100%万无一失的方法来删除这些锁定文件。给它们加上时间戳可能会有所帮助,但代价是必须每隔几秒钟写一次磁盘。很多程序只是在启动时搜索锁文件并提示用户。是的,我们使用关机挂钩解决类似的问题,而且它们似乎在java 6下的几乎所有终端上都执行。此外,关机挂钩建议和@MichaelMyers提出的问题让我们看一看:具有讽刺意味的是,六年后,我忘记了这个问题和一个相关的问题(以及相关的现实经验)@Amber绝对正确,大多数Java应用程序都应该使用shutdown hook,但要实际处理
SIGINT
和其他信号,您需要使用
sun.misc.Signal
,如链接问题中所述。