java 多线程中的异常处理
2015-08-17 15:04
393 查看
1、java多线程中,最近线程会抛异常,但是所以自然的想着通过try catche来捕获异常:
抛异常代码段为:
后来发现异常在线程里面抛出以后我们截取不到,最后才反应过来 自己是二逼呀。
当线程抛出异常以后,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。JVM的这种设计源自于这样一种理念:“线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”所以我们不能够直接捕获异常。
解决方法为:在执行线程的时候,传递一个List用于保存当前线程的异常。然后当线程执行完毕以后就将这个list返回,这样就可以获取到线程的异常。或者使用java提供的线程异常回调函数。
try { thread1.start(); } catch (Exception e) { System.out.println("thread1 异常被捕获"); }
抛异常代码段为:
public void run() { synchronized (lock) { int[] a = {1}; System.out.println("this is thread One"); System.out.println(a[2]); }
后来发现异常在线程里面抛出以后我们截取不到,最后才反应过来 自己是二逼呀。
当线程抛出异常以后,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。JVM的这种设计源自于这样一种理念:“线程是独立执行的代码片断,线程的问题应该由线程自己来解决,而不要委托到外部。”所以我们不能够直接捕获异常。
解决方法为:在执行线程的时候,传递一个List用于保存当前线程的异常。然后当线程执行完毕以后就将这个list返回,这样就可以获取到线程的异常。或者使用java提供的线程异常回调函数。
相关文章推荐
- hdu 1326 java (理解起来很简单)
- java中计算两个时间差
- 获取spring容器,以访问容器中定义的其他bean
- java 反射
- JavaBean对象转map
- java代码执行顺序
- java验证码
- eclipse优化之eclipse验证设置,让eclipse跑得更快
- springMVC+json构建restful风格的服务
- Spring事务管理只对出现运行期异常进行回滚
- Java安全结构“沙盒”模型4个组成部分
- spring security 多登陆入口实现方式 以及对spring security认证流程的理解
- “J-Hi”Java开源平台的生力军
- eclipse安装使用fat打jar包
- Java中计算某一天所在周的星期一和星期天的日期函数
- java中生成32位随机ID
- Intellij IDEA创建Java Web工程以及部署
- java 建造者模式
- java 之 单例模式
- Java 多线程(六) synchronized关键字详解