有效地使用UncaughtExceptionHandler

我最近了解了这个Java 1.5function,并开发了一个示例代码来使用它。 我的目标是在线程因未捕获的exception而死亡时重新启动线程。

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(); } } 

这里的文件阅读器只包含一个读取文件和打印内容的例程。 我通过在该类中使文件名为null来模拟未捕获的exception。

然后我的CustomExceptionHandler类如下。

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

但在这里我发现了一个问题。 在未捕获的exception之后,线程处于hibernate状态。 我使用分析器validation了它。 所以创建新线程会让我的记忆充满时间。 使system.gc()后跟at = null不起作用。

那么你建议采用什么方法来处理这种情况? 我只需要一个新线程,我不再需要任何旧线程….

谢谢

我建议的方法是不要让exception泄漏出你的线程。 未捕获的exception处理程序是一个非常好的工具,但是,如果您使用它来确保您的线程正在运行,我建议您有设计或代码问题。 你的线程正在死于可怕的死亡,只是忽略它并重新启动它可能不是你想要做的,即使你能够找出睡眠线程问题。

想象一下,而不是在你的线程中,问题在于你的main()方法 – 你是否会让同样的exception一直泄漏并杀死你的应用程序? 如果没有,你会采取什么措施来缓解这个问题? 你不会写一个再次调用main()的exception处理程序吗? 无论你做什么,这都是你应该在你的线程中做的。

您不应该重新启动即将退出的线程给定线程终止时调用该方法。 所以你只能创建并启动一个新线程。 如果您了解threads类(通过instanceof …),您可以从中获取runnable并在终止线程组中创建一个新线程,并从UncaughtExceptionHandler中启动它。

但是请注意:我会检查具体的例外情况。 最小值可以是:只有当throwable是运行时exception时才重启,而不是错误!