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 不会自行终止线程,除非发生以下三种情况之一:
- JVM 已关闭
- 线程的(或者它是
Runnable
的)run()
方法退出
- 它的(或
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()
方法。
我有一个 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 不会自行终止线程,除非发生以下三种情况之一:
- JVM 已关闭
- 线程的(或者它是
Runnable
的)run()
方法退出 - 它的(或
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()
方法。