JVM 可以在应用程序处于 运行 时(突然)终止 timer/daemon 线程吗?

Can JVM kill a timer/daemon thread while app is running (abruptly)?

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

所以我的问题是:JVM 可以突然终止任何线程吗?

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

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

引用自Thread::setDaemon

Marks this thread as either a daemon thread or a user thread. The Java Virtual Machine exits when the only threads running are all daemon threads.

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

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

So my question is can jvm abruptly kill any thread.

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

  • How does the JVM terminate daemon threads? or How to write daemon threads that terminate gracefully

what is the best solution to schedule a task . since my task execution time is coming at runtime I cant use fixed schedule executors.

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

看看是不是守护线程,直到:

才会停止
  1. 分配给线程的作业已完成。
  2. System.exit() 被调用。
  3. 如果发生错误或异常。
  4. 如果 JVM 已停止。

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