2019独角兽企业重金招聘Python工程师标准>>>

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

但如果线程确实没有自己try catch某个unchecked exception,而我们又想在线程代码边界之外(run方法之外)来捕获和处理这个异常的话,java为我们提供了一种线程内发生异常时能够在线程代码边界之外处理异常的回调机制,即Thread对象提供的setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法。

通过该方法给某个thread设置一个UncaughtExceptionHandler,可以确保在该线程出现异常时能通过回调UncaughtExceptionHandler接口的public void uncaughtException(Thread t, Throwable e) 方法来处理异常,这样的好处或者说目的是可以在线程代码边界之外(Thread的run()方法之外),有一个地方能处理未捕获异常。但是要特别明确的是:虽然是在回调方法中处理异常,但这个回调方法在执行时依然还在抛出异常的这个线程中!另外还要特别说明一点:如果线程是通过线程池创建,线程异常发生时UncaughtExceptionHandler接口不一定会立即回调。

比之上述方法,还有一种编程上的处理方式可以借鉴,即,有时候主线程的调用方可能只是想知道子线程执行过程中发生过哪些异常,而不一定会处理或是立即处理,那么发起子线程的方法可以把子线程抛出的异常实例收集起来作为一个Exception的List返回给调用方,由调用方来根据异常情况决定如何应对。不过要特别注意的是,此时子线程早以终结。

转载于:https://my.oschina.net/pangzhuzhu/blog/326990

java多线程中的异常处理相关推荐

  1. java多线程中的join方法详解

    java多线程中的join方法详解 方法Join是干啥用的? 简单回答,同步,如何同步? 怎么实现的? 下面将逐个回答. 自从接触Java多线程,一直对Join理解不了.JDK是这样说的:join p ...

  2. Java多线程中的ThreadLocal,可继承,可修改

    Java多线程中的ThreadLocal,可继承,可修改. package test;import java.util.Date;public class InheritableThreadLocal ...

  3. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  4. java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?

    转载自 java多线程中的死锁.活锁.饥饿.无锁都是什么鬼? 死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁 ...

  5. java 多线程的单例模式,Java多线程中的单例模式两种实现方式

    Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { priv ...

  6. java多线程同步与死锁_浅析Java多线程中的同步和死锁

    Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...

  7. Java多线程中static变量的使用

    Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果? Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果?仅仅是多耗资源还是会引发异 ...

  8. java多线程中volatile关键字

    一:计算机中的内存模型 计算机中指令都通过CPU去执行,执行执行的时候一般都会涉及到读写,我们都知道CUP的计算速度是很快的,如果都把数据放到我们的主存中则会造成CPU每执行一条指令都要等待的问题,这 ...

  9. java多线程中注入Spring对象问题

    web应用中java多线程并发处理业务时,容易抛出NullPointerException. 原因: 线程中的Spring Bean没有被注入.web容器在启动时,没有提前将线程中的bean注入,在线 ...

最新文章

  1. oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程
  2. 什么是机器人底盘 答案在这里!
  3. 位移时小心一下运算符的优先级
  4. 使用UPnP来穿透NAT使内网接口对外网可见
  5. Linux 服务详解
  6. 一个查看UI5控件所有公有方法的小技巧
  7. LeetCode:409、最长回文串
  8. 拒绝捞回中的效果评估与策略二次调用
  9. java后端分页查询_java后端分页方案
  10. android如何获取系统开机时间
  11. [SOC]clock与reset设计
  12. 机器视觉 边缘检测算子
  13. 《C Primer Plus》第七章--C控制语句:分支和跳转(if else switch continue break goto 逻辑运算符ctype.h)
  14. 【平衡树】 [HNOI2012]永无乡
  15. FTP:文件传输协议
  16. 关于duilib CComboUI控件下拉框 字体显示 与xml 设置不相符的问题
  17. 使用 HBuilder X 将微信 小程序 项目 打包
  18. oracle 移动加权平均,移动加权平均物料类别和成本工作流设置说明
  19. 移动端测试和开发工作中常用的安卓开发者选项
  20. 拯救屏幕接口腐蚀严重的苹果A1989,不换屏给客户省了1K多

热门文章

  1. Win2000 DDK 附带例子概览(图解)
  2. 图解VC#版DirectX开发教程二 - 摄像机
  3. Python(3) 进制转换
  4. c#调用带有自定义表结构的存储过程
  5. xsy 1836 - Shop
  6. C++ 11 中的POD
  7. 如何评价软件写的好还是坏?
  8. mySql完全手册2011031401
  9. linux多节点部署,Linux下docker部署+面板portainer管理多节点docker
  10. oracle sqlcode 多条,SQL查询以连接Oracle中多个行的列值