zoukankan      html  css  js  c++  java
  • java线程异常处理方法

    工作中常发现有些程序发生异常但却没有错误日志,原因就是一些开发线程异常处理错误,导致程序报错但异常信息打印到堆栈上,不好在生产环境中定位问题。

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。但是线程依然有可能抛出unchecked exception(如运行时异常),当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。JVM的这种设计源自于这样一种理念:“线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”基于这样的设计理念,在Java中,线程方法的异常(无论是checked还是unchecked exception),都应该在线程代码边界之内(run方法内)进行try catch并处理掉.换句话说,我们不能捕获从线程中逃逸的异常。

    线程异常处理解决方法:

    ① 在run()中设置对应的异常处理,主动方法来解决未检测异常;推荐这种做法,有异常就输出。

    ② Thread类API中提供Interface接口UncaughtExceptionHandler,该接口包含uncaughtException方法,它能检测出某个未捕获的异常而终结的情况;设置UncaughtExceptionHandler异常处理:

    方式一:通过Thread提供的静态static方法,设置默认异常处理:public static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler ux)

    方式二:通过方法:public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)

    但要注意使用线程池执行线程时上面的设置可能没用,默认情况下,线程池 java.util.concurrent.ThreadPoolExecutor 会Catch住所有异常, 当任务执行完成(java.util.concurrent.ExecutorService.submit(Callable))获取其结果 时(java.util.concurrent.Future.get())会抛出此RuntimeException。 只有通过execute提交的任务,且在run方法内设置UncaughtExceptionHandler时才能将它抛出的异常交给UncaughtExceptionHandler,而通过submit提交的任务,无论是抛出的未检测异常还是已检查异常,都将被认为是任务返回状态的一部分。如果一个由submit提交的任务由于抛出了异常而结束,那么这个异常将被Future.get封装在ExecutionException中重新抛出。

    需要重载覆盖ThreadPoolExecutor.afterExecute 方法,我们才能捕获到任务的异常(RuntimeException)。

    参考:

    http://blog.csdn.net/u013256816/article/details/50417822
    http://www.blogjava.net/xylz/archive/2013/08/05/402405.html

  • 相关阅读:
    [转]Ant入门教程
    [转]如何用CruiseControl.Net来进行持续化集成
    [书目20130216]深入浅出WPF
    [转]WF事件驱动(4) 持久化
    [转]WF4.0 基础篇 (一)开始使用WF
    [转]VS2010&.Net 4.0 之并行运算(Parallel)(For、Foreach)
    [转]SVN + CruiseControl.NET + NANT 自动编译提交的项目最小DEMO
    [转]WF4.0 基础篇 (六) 数据的传递 Arguments 参数
    [转]WF事件驱动(1)
    [转]WCF开发简简单单的六个步骤
  • 原文地址:https://www.cnblogs.com/doit8791/p/8047962.html
Copyright © 2011-2022 走看看