快速业务通道

驯服Tiger: 线程中的默认异常处理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
                     final int height) {   super(title);   EventQueue.invokeLater(new Runnable() {    public void run() {     setSize(width, height);     textArea = new JTextArea();     JScrollPane pane = new JScrollPane(textArea);      textArea.setEditable(false);      getContentPane().add(pane);      setVisible(true);     }    });   }   public void addLogInfo(final String data) {    EventQueue.invokeLater(new Runnable() {     public void run() {      textArea.append(data);     }    });   } }

执行 清单 3 中的 WindowDump 程序将出现图 1 中的屏幕。因为没有从 Logger 中删除控制台处理程序,所以堆栈溢出仍将出现在控制台上。

图 1. 记录的堆栈跟踪

驯服Tiger: 线程中的默认异常处理 - 编程入门网

发生运行时异常时,可能要做许多工作来更改发生的问题。该代码的大部分都是 Logging Handler,但是,要执行更改,就必须细分 ThreadGroup ,重写 uncaughtException() ,然后在该线程组中执行您的线程。不过,让我们通过只安装 Thread.UncaughtExceptionHandler ,来看一看 Tiger 的处理方式。

驯服Tiger: 线程中的默认异常处理(4)

时间:2011-01-31 John Zukowski

使用 UncaughtExceptionHandler 的定制行为

对于 Tiger,Thread 类定义中添加了一个新的公共内部类 UncaughtExceptionHandler ,更完整的名称为 Thread.UncaughtExceptionHandler (其他类访问内部类时需要使用完整名称)。接口的定义是一个方法,如图 7 中所示:

清单 7. UncaughtExceptionHandler 的定义

public interface Thread.UncaughtExceptionHandler {    public void uncaughtException(Thread, Throwable); }

您可能没有注意到,清单 7 中的方法与我们前面重写的 ThreadGroup 的方法相同。实际上,现在由 ThreadGroup 类实现该接口。

新的内部类可以帮助我们了解下列两对新方法,并有助于我们在 Thread 中使用它们:

getUncaughtExceptionHandler() 和 setUncaughtExceptionHandler()。

getDefaultUncaughtExceptionHandler() 和 setDefaultUncaughtExceptionHandler()。

第一对方法是 getUncaughtExceptionHandler() 和 setUncaughtExceptionHandler() ,它们允许您为当前线程及其后代定制行为,从而允许二十或更多的线程拥有自己的定制行为。不过,您更可能使用第二对方法 getDefaultUncaughtExceptionHandler() 和 setDefaultUncaughtExceptionHandler() 。如果使用第二对方法设置默认处理程序,那么没有自己的异常处理程序的所有线程都将使用默认处理程序。

听起来好像很简单。为了进行说明,清单 8 转换了 清单 3 中的 ThreadGroup 友好的程序,使用新的 UncaughtExceptionHandler 接口:

清单 8. UncaughtExceptionHandler 示例

public class HandlerDump {   public static void main(String args[]) throws Exception {    Thread.UncaughtExceptionHandler handler = new LoggingThreadGroup("Logger");    Thread.currentThread().setUncaughtExceptionHandler(handler);    System.out.println(1 / 0);   } }

该程序只是将 LoggingThreadGroup 重用为 UncaughtExceptionHandler ,并没有创建新的处理程序实现。请注意,与原来的代码相比,新代码要简洁得多。

其他线程更改

Thread 类不仅支持使用 Tiger 添加的未捕获异常处理程序,它还支持使用 getAllStackTraces() 获得所有有效线程的堆栈跟踪,或者支持使用 getStackTrace() 来只获得当前线程的堆栈跟踪。这两种堆栈跟踪都返回类型为 java.lang.StackTraceElement 的对象,java.lan

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号