gpt4 book ai didi

java - 如何确保长时间运行的 Java 线程永不消亡

转载 作者:行者123 更新时间:2023-12-01 18:42:46 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

您可以做的是让一个观察者检查线程是否每 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.
}
}
}

关于java - 如何确保长时间运行的 Java 线程永不消亡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59889737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com