首页 > 解决方案 > 如何确保长时间运行的 Java 线程永不死亡

问题描述

我有一个长时间运行的线程来完成家务。鉴于系统不会立即受到影响,因此很难检测到线程的故障。我想确保这个线程永远不会消失。我的理解是只要代码捕捉到所有东西(Throwable),它就永远不会死。这是示例代码:

while (true) {
    try {
        // house keeping logic
    } catch (Throwable t) {
        // do not do anything
    }
}

我的理解正确吗?有没有更好的方法来托管长时间运行的后台任务?我知道 ScheduledExecutorService 可以定期安排任务,但如果任务需要不断检查某些资源,将所有内容放在一个 while 循环中可能更有效。

标签: javamultithreadingexception

解决方案


你不能保证长时间运行的线程。但是,如果您的线程出现问题,您可以重新生成逻辑。

你可以做的是有一个观察者,它会检查线程是否每 x 分钟运行一次。

请注意,如果 JVM 关闭或崩溃,观察程序将失败。如果你想在JVM关闭的情况下重新启动线程,你需要有外部监控。为此,您可以使用诸如supervisord 之类的工具。

public class LongRunningThread extends Thread {
    private volatile boolean IS_RUNNING = true;

    @Override
    public void run() {
        while (IS_RUNNING) {
            try {
                // actions
                this.houseKeep();
            } catch (Exception e) {
            }
        }
    }

    private void houseKeep() {
        // housekeeping logic here
    }

}

class ThreadWatcher {
    private Thread threadToBeWatched;

    public ThreadWatcher(Thread threadToBeWatched) {
        this.threadToBeWatched = threadToBeWatched;
    }

    @Scheduled(cron = "*/1 * * * *")
    public void checkStatus() {
        if (!threadToBeWatched.isAlive()) {
            // Logic to restart the thread.
        }
    }
}

推荐阅读