我打算创建一个行为类似于计时器的线程。我将使用睡眠在特定延迟后重新触发操作。
如果JVM在没有关闭应用程序的情况下突然终止我的线程,我很担心
因此,如果应用程序正在运行并且此线程死亡,我的功能将无法获得新的令牌
要么我必须写一些手动功能来重新启动它。
所以我的问题是:JVM能否突然杀死任何线程?
安排任务的最佳解决方案是什么?由于我的任务执行时间是在运行时,我不能使用固定的计划执行程序。
答案 0 :(得分:1)
据我所知,JVM不会随机杀死任何线程,因为这会导致所有Java程序的未定义行为。但是,如果没有运行线程不是守护程序线程,JVM将自行关闭并终止任何正在运行的线程,该线程被标记为守护线程。
将此线程标记为守护程序线程或用户线程。当运行的唯一线程都是守护程序线程时,Java虚拟机将退出。
要重复安排任务,您应尽可能使用ScheduledExecutorService
。你在运行时得到延迟这一事实并不妨碍你这样做。
答案 1 :(得分:1)
所以我的问题是jvm会突然杀死任何线程。
通常,它取决于线程及其创建方式以及JVM 突然杀死的含义。 JVM在关闭时通知所有守护进程。请看看:
安排任务的最佳解决方案是什么。因为我的任务执行时间是在运行时来的,所以我不能使用固定的计划执行程序。
在您的情况下,我认为最好的解决方案是使用提供的实现。为什么你不能使用ScheduledExecutorService
,我不理解运行时参数。看看Stefan Dollase的答案,因为他提供了一些关于它的使用的更多见解。
答案 2 :(得分:0)
看看它是否是一个守护程序线程,它将不会停止:
这里只有第三个问题。要解决此问题,请使用try-catch捕获Throwable(这将捕获所有内容),并在catch中编写一个重新运行该函数的机制。