代码之家  ›  专栏  ›  技术社区  ›  Chathuranga Chandrasekara

有效地使用UncaughtExceptionHandler

  •  1
  • Chathuranga Chandrasekara  · 技术社区  · 16 年前

    我最近了解了Java1.5的功能,并开发了一个示例代码来使用它。我的目标是在线程由于未捕获的异常而死机时重新启动线程。

    public class ThreadManager {
    
        public static void main(String[] args) throws InterruptedException {
            startThread();
        }
    
        public static void startThread(){
            FileReaderThread reader = new FileReaderThread("C:\\Test.txt");
            Thread thread = new Thread(reader);
            thread.setUncaughtExceptionHandler(new CustomExceptionHandler());
            thread.start();
        }
    }
    

    然后我的CustomExceptionHandler类如下所示。

    public class CustomExceptionHandler implements Thread.UncaughtExceptionHandler {
    
        public void uncaughtException(Thread t, Throwable e) {
            ThreadManager.startThread();
        }
    }
    

    但在这里我发现了一个问题。在未捕获异常之后,线程处于休眠状态。我用分析器验证了它。因此,创建新的线程会随着时间的推移填满我的记忆。使system.gc()后跟一个t=null不起作用。

    那么,您建议的处理这种情况的最佳方法是什么?我只需要一个新的线程,我不想要任何旧的线程了。。。。

    2 回复  |  直到 13 年前
        1
  •  4
  •   SingleShot    16 年前

    我建议的方法是不要让异常从线程中泄漏出来。未捕获异常处理程序是一个很好的工具,但是,如果您使用它来确保线程正在运行,我建议您在设计或代码方面存在问题。您的线程正在以可怕的方式死亡,而忽略这一点并重新启动一个新线程可能不是您想要做的事情,即使您能够解决睡眠线程的问题。

    想象一下,问题不是在你的线程中,而是在你的 main() 方法-你会让同样的异常一路泄漏出去并杀死你的应用程序吗?如果没有,您将如何缓解该问题?您不会编写调用 main()

        2
  •  1
  •   Arne Burmeister    16 年前

    您不应该重新启动 即将退出的线程 . 方法是 . 因此,您只能创建并启动一个新线程。如果您知道threads类(通过instanceof…),您可以从中获取runnable,并在terminating threads组中创建一个新线程,然后从UncaughtExceptionHandler启动它。