Java 线程 运行 在无限循环中长时间 运行 被 JVM 终止的场景

Scenario's where a Java thread running in infinite loop for a long run be terminated by JVM

我有一个 Runnable 线程,它在无限循环中循环。每次迭代它都会睡到下一个任务时间,然后执行一些任务。此任务非常关键,因此使线程 运行ning 它也非常关键。我不是真正的 java 线程专家,所以我想知道 JVM 可能决定停止/终止该线程的各种场景或可能性是什么。在应用程序级别,运行ning 线程的数量没有限制。我担心 JVM 在长时间 运行.

中的行为方式

目前在我的本地测试系统中一切正常,但我几个小时都无法测试它。这是 Apache Tomcat.

下的 Web 应用程序 运行ning

线程创建和 运行ning 很简单,如下所示:

Thread taskThread = new Thread(new TaskRunnable(taskObject));
taskThread.start();

循环:

public void run()
{
  for (;;)
  {
    long sleepTime = this.taskObject.getNextTaskTime() - System.currentTimeMillis();

    if (sleepTime > 0L) {
      try
      {
        Thread.sleep(sleepTime);
      }
      catch (InterruptedException localInterruptedException)
      {
        localInterruptedException.printStackTrace();
      }
    }
    this.taskObject.performTask(); // also computes next task time
  }
}

或者只要 运行ning 线程本身没有异常,这对 long-运行 就可以正常工作..

Java 不会自行终止线程,除非发生以下三种情况之一:

  1. JVM 已关闭
  2. 线程的(或者它是 Runnable 的)run() 方法退出
  3. 它的(或Runnable的)run()方法抛出了一个未捕获的异常。

只要 JVM 启动或被中断,该线程就会一直运行:

public class MyLongRunningThread extends Thread {
    @Override
    public void run() {
        while(true) {
            try {
                // Do stuff
             } catch(InterruptedException e) {
                 // The thread was interrupted, which means someone wants us to stop
                 System.out.println("Interrupted; exiting");
                 return;
             } catch(RuntimeException e) {
                 e.printStackTrace();
             }
        }
    }
}

请注意,线程被中断的唯一方法是您(或您正在使用的某些框架)调用它的 interrupt() 方法。