我计划创建一个行为类似计时器的线程。我将使用睡眠在特定延迟后重新触发操作
我担心JVM是否会在不关闭应用程序的情况下突然终止我的线程,
所以,如果应用程序正在运行,而这个线程死了,我的功能将无法获得新的令牌
要么我必须写一些手动功能来重新启动它。
所以我的问题是:JVM会突然杀死任何线程吗?
安排任务的最佳解决方案是什么?由于我的任务执行时间是在运行时到来的,所以我不能使用固定的时间表执行器。
据我所知,JVM不会随机杀死任何线程,因为这会导致所有Java程序的未定义行为。但是,如果没有不是守护进程线程的正在运行的线程,JVM将关闭自己并杀死任何被标记为守护进程线程。
引用Thread::setDaemon
:
将此线程标记为守护进程线程或用户线程。当唯一运行的线程都是守护进程线程时,Java虚拟机将退出。
要重复安排任务,应尽可能使用ScheduledExecutorService
。你在运行时得到延迟的事实并不能阻止你这样做
另请参阅:从定时器线程调用java定时器任务
所以我的问题是jvm会突然杀死任何线程吗。
一般来说,这取决于线程及其创建方式,以及JVM突然终止意味着什么。JVM在关闭时通知所有守护进程。请看一下:
- JVM退出后守护进程线程如何生存
- JVM如何终止守护进程线程?或者如何编写正常终止的守护进程线程
安排任务的最佳解决方案是什么。由于我的任务执行时间是在运行时到来的,所以我不能使用固定的时间表执行器。
在您的情况下,我认为最好的解决方案是使用所提供的实现。为什么不能使用ScheduledExecutorService
,我不理解运行时参数。看看Stefan Dollase的回答,因为他对它的用法有更多的见解。
如果它是守护进程线程,它将不会停止,直到:
- 赋予线程的作业已完成
- 调用System.exit()
- 如果出现错误或异常
- 如果JVM已停止
这里只有第三个问题涉及。要解决这个问题,请使用try-catch,它捕获Throwable(这将捕获所有内容),并在catch中编写一个机制来重新运行函数。