【问题标题】:Scenario's where a Java thread running in infinite loop for a long run be terminated by JVM长期无限循环运行的Java线程被JVM终止的场景
【发布时间】:2015-07-31 01:24:18
【问题描述】:

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

目前在我的本地测试系统中一切正常,但我几乎无法测试几个小时。这是一个在 Apache Tomcat 下运行的 Web 应用程序。

线程的创建和运行很简单,如下图:

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
  }
}

或者,只要正在运行的线程本身没有异常,这将长期运行良好..

【问题讨论】:

  • JVM 不会随意自动停止线程。您可以通过使用ExecutorService 而不是自己管理线程来简化此操作。

标签: java tomcat jvm java-threads


【解决方案1】:

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() 方法。

【讨论】:

    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多