JVM会在应用程序运行时(突然)杀死计时器/守护进程线程吗



我计划创建一个行为类似计时器的线程。我将使用睡眠在特定延迟后重新触发操作
我担心JVM是否会在不关闭应用程序的情况下突然终止我的线程,
所以,如果应用程序正在运行,而这个线程死了,我的功能将无法获得新的令牌
要么我必须写一些手动功能来重新启动它。

所以我的问题是:JVM会突然杀死任何线程吗?

安排任务的最佳解决方案是什么?由于我的任务执行时间是在运行时到来的,所以我不能使用固定的时间表执行器。

据我所知,JVM不会随机杀死任何线程,因为这会导致所有Java程序的未定义行为。但是,如果没有不是守护进程线程的正在运行的线程,JVM将关闭自己并杀死任何被标记为守护进程线程。

引用Thread::setDaemon:

将此线程标记为守护进程线程或用户线程。当唯一运行的线程都是守护进程线程时,Java虚拟机将退出。

要重复安排任务,应尽可能使用ScheduledExecutorService。你在运行时得到延迟的事实并不能阻止你这样做

另请参阅:从定时器线程调用java定时器任务

所以我的问题是jvm会突然杀死任何线程吗。

一般来说,这取决于线程及其创建方式,以及JVM突然终止意味着什么。JVM在关闭时通知所有守护进程。请看一下:

  • JVM退出后守护进程线程如何生存
  • JVM如何终止守护进程线程?或者如何编写正常终止的守护进程线程

安排任务的最佳解决方案是什么。由于我的任务执行时间是在运行时到来的,所以我不能使用固定的时间表执行器。

在您的情况下,我认为最好的解决方案是使用所提供的实现。为什么不能使用ScheduledExecutorService,我不理解运行时参数。看看Stefan Dollase的回答,因为他对它的用法有更多的见解。

如果它是守护进程线程,它将不会停止,直到:

  1. 赋予线程的作业已完成
  2. 调用System.exit()
  3. 如果出现错误或异常
  4. 如果JVM已停止

这里只有第三个问题涉及。要解决这个问题,请使用try-catch,它捕获Throwable(这将捕获所有内容),并在catch中编写一个机制来重新运行函数。

最新更新