0

我有一个可运行的线程,它循环通过一个无限循环。每次迭代它都会休眠到下一个任务时间,然后执行一些任务。这项任务非常关键,因此运行它的线程也非常关键。我并不是真正的 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
  }
}

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

4

1 回答 1

3

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

  1. JVM 已关闭
  2. 线程的(或它的Runnablerun()方法退出
  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()方法。

于 2015-05-19T09:43:11.210 回答