当应用程序运行时(突然),JVM能否终止计时器/守护程序线程?

时间:2016-03-23 23:59:28

标签: java jvm java-8 java-7 jvm-crash

我打算创建一个行为类似于计时器的线程。我将使用睡眠在特定延迟后重新触发操作。
如果JVM在没有关闭应用程序的情况下突然终止我的线程,我很担心 因此,如果应用程序正在运行并且此线程死亡,我的功能将无法获得新的令牌 要么我必须写一些手动功能来重新启动它。

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

安排任务的最佳解决方案是什么?由于我的任务执行时间是在运行时,我不能使用固定的计划执行程序。

3 个答案:

答案 0 :(得分:1)

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

引自Thread::setDaemon

  

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

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

另请参阅:Invoking a java Timer-Task from the timer thread

答案 1 :(得分:1)

  

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

通常,它取决于线程及其创建方式以及JVM 突然杀死的含义。 JVM在关闭时通知所有守护进程。请看看:

  

安排任务的最佳解决方案是什么。因为我的任务执行时间是在运行时来的,所以我不能使用固定的计划执行程序。

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

答案 2 :(得分:0)

看看它是否是一个守护程序线程,它将不会停止:

  1. 完成了给线程的工作。
  2. 调用System.exit()。
  3. 如果发生错误或异常。
  4. 如果JVM已停止。
  5. 这里只有第三个问题。要解决此问题,请使用try-catch捕获Throwable(这将捕获所有内容),并在catch中编写一个重新运行该函数的机制。