由于线程的特性,当我们启动了线程是没有办法用try catch捕获异常的,如下例:

 1 package com.xt.thinks21_2;
 2
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5
 6 /**
 7  * 线程异常捕获测试
 8  *
 9  * @author xue
10  *
11  */
12 public class ThreadUncaughtExceptionTest implements Runnable {
13
14     @Override
15     public void run() {
16         // TODO Auto-generated method stub
17         throw new NullPointerException();
18     }
19
20     public static void main(String[] args) {
21         try {
22             ExecutorService es = Executors.newCachedThreadPool();
23             es.execute(new ThreadUncaughtExceptionTest());
24             es.shutdown();
25             // or this
26             // Thread t = new Thread(new ThreadUncaughtExceptionTest());
27             // t.start();
28         } catch (Exception e) {
29             // TODO: handle exception
30         }
31
32     }
33 }

打印异常信息为:

Exception in thread "pool-1-thread-1" java.lang.NullPointerException
at com.xt.thinks21_2.ThreadUncaughtExceptionTest.run(ThreadUncaughtExceptionTest.java:17)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

此时,我们需要为线程定制工厂类来生产线程,为线程指定UncaughtExceptionHandler

 1 package com.xt.thinks21_2;
 2
 3 import java.lang.Thread.UncaughtExceptionHandler;
 4 import java.util.concurrent.ExecutorService;
 5 import java.util.concurrent.Executors;
 6 import java.util.concurrent.ThreadFactory;
 7
 8 /**
 9  * 未捕获异常执行程序
10  *
11  * @author Administrator
12  *
13  */
14 class ThreadUncaughtExceptionHandler implements UncaughtExceptionHandler {
15
16     @Override
17     public void uncaughtException(Thread t, Throwable e) {
18         // TODO Auto-generated method stub
19         System.out.println("caught:" + e);
20     }
21
22 }
23
24 /**
25  * 线程工厂
26  *
27  * @author Administrator
28  *
29  */
30 class HandlerThreadExceptionFactory implements ThreadFactory {
31
32     @Override
33     public Thread newThread(Runnable r) {
34         // TODO Auto-generated method stub
35         Thread t = new Thread(r);
36         t.setUncaughtExceptionHandler(new ThreadUncaughtExceptionHandler());
37         return t;
38     }
39
40 }
41
42 /**
43  * 线程异常捕获测试
44  *
45  * @author xue
46  *
47  */
48 public class ThreadUncaughtExceptionTest implements Runnable {
49
50     @Override
51     public void run() {
52         // TODO Auto-generated method stub
53         throw new NullPointerException();
54     }
55
56     public static void main(String[] args) {
57         ExecutorService es = Executors
58                 .newCachedThreadPool(new HandlerThreadExceptionFactory());
59         es.execute(new ThreadUncaughtExceptionTest());
60         es.shutdown();
61     }
62 }

此时,我们就可以看到异常信息被捕获到了:

caught:java.lang.NullPointerException

转载于:https://www.cnblogs.com/wubingshenyin/p/4448980.html

JAVA并发,线程异常捕获相关推荐

  1. 并发编程五:java并发线程池底层原理详解和源码分析

    文章目录 java并发线程池底层原理详解和源码分析 线程和线程池性能对比 Executors创建的三种线程池分析 自定义线程池分析 线程池源码分析 继承关系 ThreadPoolExecutor源码分 ...

  2. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

  3. 理解和解决Java并发修改异常ConcurrentModificationException(转载)

    原文地址:https://www.jianshu.com/p/f3f6b12330c1 理解和解决Java并发修改异常ConcurrentModificationException 不知读者在Java ...

  4. Java多层的异常捕获

    Java多层的异常捕获 参考文章: (1)Java多层的异常捕获 (2)https://www.cnblogs.com/somedayLi/p/7847136.html 备忘一下.

  5. java 并发 线程安全_Java并发教程–线程安全设计

    java 并发 线程安全 在回顾了处理并发程序时的主要风险(例如原子性或可见性 )之后,我们将通过一些类设计来帮助我们防止上述错误. 其中一些设计导致了线程安全对象的构造,从而使我们能够在线程之间安全 ...

  6. java 并发线程_Java并发教程–线程之间的可见性

    java 并发线程 当在不同线程之间共享对象的状态时,除了原子性外,其他问题也会发挥作用. 其中之一是可见性. 关键事实是,如果没有同步,则不能保证指令按照它们在源代码中出现的顺序执行. 这不会影响单 ...

  7. JAVA Thread线程异常监控

    一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...

  8. Java并发—线程池ThreadPoolExecutor基本总结

    原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...

  9. Java并发线程之线程池

    初始化线程池后,把任务丢进去,等待调度就可以了,使用起来比较方便. JAVA中Thread是线程类,不建议直接使用Thread执行任务,在并发数量比较多的情况下,每个线程都是执行一个很短的时间就任务结 ...

最新文章

  1. kotlin + springboot 整合redis,Redis工具类编写及单元测试
  2. 华为:HarmonyOS 即将开源!
  3. Centos7+Mysql5.7实现主从复制
  4. 我的C#文章模块代码
  5. 检测网络耗时_无人机替代桥梁检测车检测桥梁的可行性分析
  6. 数据结构 (计算机存储、组织数据方式)
  7. IIs管理服务一直启动失败的原因之一
  8. ubuntu14.04上网问题
  9. 分解连续自然数的和_小学奥数各年级经典题解题技巧大全——分解因数法(2)...
  10. 杭州python靠谱吗_杭州Python高薪就业靠谱吗?
  11. 大学英语期末考计算机上答卷,英语期末考试质量分析
  12. excel 统计字数公式
  13. python协同过滤算法_协同过滤算法介绍及算法实现
  14. Could not load type 'System.DateTimeOffset'的问题
  15. 四大行的CIO们如何看待大数据
  16. linux蓝牙主从机模式代码,技术贴 丨 Android 蓝牙BLE开发Docker入门与WMS2.0实例
  17. 石家庄12重点项目开工,滹沱新区更名为正定新区
  18. 关于登录PL/SQL时出现的错误:error while tring to retrieve text for error ORA-12541
  19. 车贷真比房贷利率低?
  20. js Function对象扩展与延时执行函数实例代码

热门文章

  1. onvif备忘录(1)--onvif简介及开发框架搭建
  2. 长挺丑,Go 最新的泛型类型约束语法介绍
  3. 当面试官问你Vue响应式原理,你可以这么回答他
  4. 【转】ASIHTTPRequest开源类库进行http请求
  5. 用路由做企业管理:所有人都说不可能的时候(中)
  6. Python操作文件文档
  7. Etl之HiveSql调优(left join where的位置)
  8. ASIHTTPRequest详解
  9. Git下使用Beyond Compare作为比较和合并工具
  10. xp 优化   转自天涯