java - 如何确保长时间运行的 Java 线程永不死亡
问题描述
我有一个长时间运行的线程来完成家务。鉴于系统不会立即受到影响,因此很难检测到线程的故障。我想确保这个线程永远不会消失。我的理解是只要代码捕捉到所有东西(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.
}
}
}
推荐阅读
- bash - wget 无法使用 --include 获取 4 级目录
- java - 无法让 Java 程序运行 - 它找不到 jvm.dll
- haskell - 列表的 writer monad 效率如何?
- ios - Firebase 不会创建孩子
- tsql - 将 CSV 从 Azure Data Lake(第 2 代)加载到 Azure SQL 数据库
- ios - UICollectionViewCell 内图像视图的边框宽度问题
- java - Java how to start CMD and stay attached to it for user interaction?
- node.js - 使用带有节点/快递的书架返回搜索时更改列的名称?
- python - Python 键盘库仅在打包时出现溢出错误
- r - 选定的本地文件不显示具有不同标准的闪亮应用程序