本文主要参考:《think in java》

好,下面上货。

正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到子线程中的异常的。
例如下面的情况。

  1. package com.xueyou.demo.theadexceptiondemo;
  2. public class ThreadExceptionRunner implements Runnable{
  3. @Override
  4. public void run() {
  5. throw new RuntimeException("error !!!!");
  6. }
  7. }
使用线程执行上面的任务

  1. package com.xueyou.demo.theadexceptiondemo;
  2. import com.sun.glass.ui.TouchInputSupport;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ThreadFactory;
  6. public class ThreadExceptionDemo {
  7. public static void main(String[] args) {
  8. try {
  9. Thread thread = new Thread(new ThreadExceptionRunner());
  10. thread.start();
  11. } catch (Exception e) {
  12. System.out.println("========");
  13. e.printStackTrace();
  14. } finally {
  15. }
  16. System.out.println(123);
  17. }
  18. }
执行结果如下:

如果想要在主线程中捕获子线程的异常,我们需要使用ExecutorService,同时做一些修改。
如下:


  1. package com.xueyou.demo.theadexceptiondemo;
  2. import com.sun.glass.ui.TouchInputSupport;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ThreadFactory;
  6. public class ThreadExceptionDemo {
  7. public static void main(String[] args) {
  8. try {
  9. Thread thread = new Thread(new ThreadExceptionRunner());
  10. thread.start();
  11. } catch (Exception e) {
  12. System.out.println("========");
  13. e.printStackTrace();
  14. } finally {
  15. }
  16. System.out.println(123);
  17. ExecutorService exec = Executors.newCachedThreadPool(new HandleThreadFactory());
  18. exec.execute(new ThreadExceptionRunner());
  19. exec.shutdown();
  20. }
  21. }
  22. class MyUncaughtExceptionHandle implements Thread.UncaughtExceptionHandler {
  23. @Override
  24. public void uncaughtException(Thread t, Throwable e) {
  25. System.out.println("caught " + e);
  26. }
  27. }
  28. class HandleThreadFactory implements ThreadFactory {
  29. @Override
  30. public Thread newThread(Runnable r) {
  31. System.out.println("create thread t");
  32. Thread t = new Thread(r);
  33. System.out.println("set uncaughtException for t");
  34. t.setUncaughtExceptionHandler(new MyUncaughtExceptionHandle());
  35. return t;
  36. }
  37. }
这样就能够捕获到异常了,运行结果如下:

上面的方式是设置每一个线程执行时候的异常处理。如果每一个线程的异常处理相同,我们可以用如下的方式进行处理,使用Thread的静态方法。
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandle());
整体代码如下:


  1. package com.xueyou.demo.theadexceptiondemo;
  2. import com.sun.glass.ui.TouchInputSupport;
  3. import java.util.concurrent.ExecutorService;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ThreadFactory;
  6. /**
  7. * Created by wuxueyou on 2018/6/24.
  8. */
  9. public class ThreadExceptionDemo {
  10. public static void main(String[] args) {
  11. try {
  12. Thread thread = new Thread(new ThreadExceptionRunner());
  13. thread.start();
  14. } catch (Exception e) {
  15. System.out.println("========");
  16. e.printStackTrace();
  17. } finally {
  18. }
  19. System.out.println(123);
  20. Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandle());
  21. // ExecutorService exec = Executors.newCachedThreadPool(new HandleThreadFactory());
  22. ExecutorService exec = Executors.newCachedThreadPool();
  23. exec.execute(new ThreadExceptionRunner());
  24. exec.shutdown();
  25. }
  26. }
运行结果:


java主线程捕获子线程中的异常的更多相关文章

  1. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

  2. python主线程捕获子线程异常

    python内置threading.Thread类创建的子线程抛出的异常无法在主线程捕获,可以对该类进行优化,为子线程添加exit code属性,主线程通过获取子线程的返回状态,来判断子线程中是否发生 ...

  3. Java主线程在子线程执行完毕后再执行

    一.join() Thread中的join()方法就是同步,它使得线程之间由并行执行变为串行执行. public class MyJoinTest { public static void main( ...

  4. 线程:Java主线程等待子线程结束

    使用Thread.join()方法: public class App { public static void main(String[] args) { testMain(); } public ...

  5. 验证:java 主线程在子线程结束后才会结束

    package com.idealisan.test; /** * Hello world! * */ public class App { public static void main( Stri ...

  6. Java多线程之以7种方式让主线程等待子线程结束

    记一次主线程等待子线程结束的多种方法的学习 在学习多线程时,最开始遇到的问题其实是"计算子线程运行时间",写到最后发现本文和标题更为符合,但是仍然基于问题:"在主线程中获 ...

  7. JAVA进阶----主线程等待子线程各种方案比较(转)

    创建线程以及管理线程池基本理解 参考原文链接:http://www.oschina.net/question/12_11255?sort=time 一.创建一个简单的java线程 在 Java 语言中 ...

  8. Java并发编程原理与实战六:主线程等待子线程解决方案

    本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...

  9. java多线程实现主线程等待子线程执行完问题

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

随机推荐

  1. Java抽象与接口的区别

    Java抽象与接口的区别 答案方式一.简单来说,1.接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 2.另外,实现接口的一定要实现接口里定义的所有 ...

  2. wpa_supplicant上行接口浅析

    摘自http://blog.csdn.net/fxfzz/article/details/6176414 wpa_supplicant提供的接口 从通信层次上划分, 上行接口:wpa_supplica ...

  3. 20145214 《Java程序设计》第5周学习总结

    20145214 <Java程序设计>第5周学习总结 教材学习内容总结 try和catch Java中所有错误都会被包装为对象,可以尝试try执行程序并捕捉catch代表错误的对象后做一些 ...

  4. C#操作Excel执行分类多条件汇总合并

    之前发了一片模拟合并,详见模拟Excel同一列相同值的单元格合并 在之前的文章中介绍了思想,其中Excel采用的二维数组模拟,今天花了点时间,学习了一下C#操作Excel,实现了类似的效果! 准备 需 ...

  5. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

  6. 我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令

    一.如果数据重要,请先备份数据 二.删除表中数据 SQL: Delete From ('表名')  如:Delete From abcd 三.执行新语句 SQL: dbcc checkident('表 ...

  7. java基础简介

    一.软件开发 软件:是由数据和指令组成的(例:计算器) 如何实现软件开发呢?    就是使用开发工具和计算机语言做出东西来 二.常用dos命令 d: 回车 盘符切换 dir(directory):列出 ...

  8. Javascript-基础1

    1,变量: name="alex"  #默认是全局变量 var name="eric" #局部变量 2. 写JS代码:---html中写,---临时文件可以写在 ...

  9. CentOS 服务ftp(vsftpd)

    1.检查是否已经安装vsftpd yum list installed | grep vsftpd 2.安装vsftpd yum install -y vsftpd 3.检查vsftpd system ...

  10. 122. Best Time to Buy and Sell Stock II (Array)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...