java - 正在捕获 Java Throwable 重新启动线程的最佳方法

标签 java multithreading try-catch throwable

我在 java 中有以下代码-

@Override
public void run() {

    logger.info("Thread Started:" + this.getName());

    try {
        runJob();
    } catch( Throwable e) {
        logger.error("Exception in running thread: " + this.getName() + ", restarting job", e);
        run();
    }
}

public void runJob() {

    while(true) {
       try {
           // Work here
       } catch(Exception e) {
           // log the exception
       }
    }
 }

这段代码是否真的会在任何情况下都让线程保持 Activity 状态,这是恢复线程的唯一方法吗?

这是我在阅读所有答案后想到的替代方案。让我知道这是否是即使发生错误也能使线程永远保持 Activity 状态的好方法:

@Override
public void run() {

    logger.info("Thread Started:" + this.getName());

    while(true) {
      try {
        runJob();
      } catch( Throwable e) {
        logger.error("Exception in running thread: " + this.getName() + ", restarting job", e);
        }
    }
}

public void runJob() {

     try {
          // Work here
     } catch(Exception e) {
          // log the exception
     }
 }

最佳答案

这与“线程”关系不大。重试逻辑可以在异常情况下实现,这是常见的做法。

但是,捕获 Throwable 显然是一件危险的事情。您可能想要重试选择错误(例如超时、连接失败等),这当然需要更好地了解您的 runJob() 方法如何运行。

除此之外,您的重试实现正在进行递归 调用,这也可能很糟糕。您最终会遇到堆栈溢出错误(并且还会使用 Throwbale catch block 来catch,从而导致奇怪的行为)。而是循环并重复执行 runJob()

boolean retry = false;
do {
    try {
        runJob();
        retry = false;
    } catch (SpecificException e) { //timeout, network failure exceptions
        logger.error("Exception in running thread: "
            + this.getName() + ", restarting job");
        retry = true;
    }
} while(retry);

您可能还需要添加一个计数器来限制重试次数。

关于java - 正在捕获 Java Throwable 重新启动线程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50464070/

相关文章:

java - WebService 可与 Jetty 配合使用,但不适用于 Tomcat

Java套接字: Application with both server and client on same machine

Java 尝试使用参数上的资源

java - 如何让这个 try catch 循环直到不再出现错误?

javascript - 理解 Javascript 中的 try..catch

打开文件后 Java GUI 刷新结果

java - 抽象的目的是什么?

multithreading - 并行执行计算量大的 map

c# - 添加到并发集合

c# - Parallel.ForEach 花费的时间比预期的多