详解Java中多线程异常捕获Runnable的实现

1、背景:

Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常。所以要实现主线程对子线程异常的捕获。

2、工具:

实现Runnable接口的LayerInitTask类,ThreadException类,线程安全的Vector

3、思路:

向LayerInitTask中传入Vector,记录异常情况,外部遍历,判断,抛出异常。

4、代码:

package step5.exception;

import java.util.Vector;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

import com.autonavi.pds.core.incre.impl.LayerInitTask;

public class ThreadException {

public static void main(String[] args) {

try {

Vector errRet = new Vector();

ExecutorService pool = Executors.newFixedThreadPool(6);

for (int i = 0; i < 6; ++i) {

pool.execute(new LayerInitTask(i, errRet));

}

pool.shutdown();

pool.awaitTermination(1, TimeUnit.DAYS);

if (errRet.size() > 0) {

System.out.println("根据返回值捕获:exception");

throw new RuntimeException( "入库失败!");

}

} catch (Exception e) {

System.out.println("根据抛出异常捕获:exception");

throw new RuntimeException( "入库失败!");

}

System.out.println("-----入库成功,发成功完成工作邮件--------");

}

}

package step5.exception;

import java.util.Vector;

public class LayerInitTask implements Runnable {

private int threadNum;

private Vector errRet;

public LayerInitTask(int num, Vector errRet) {

this.threadNum = num;

this.errRet = errRet;

}

@Override

public void run() {

try {

if (this.threadNum == 3) {

throw new RuntimeException( this.threadNum + ":数据格式有误.");

}

System.out.println(this.threadNum + ":刷表成功");

} catch (Exception e) {

this.errRet.add("线程:" + this.threadNum + "运行异常!");

throw new RuntimeException( this.threadNum + ":刷表失败");

}

}

}

5、结果:

Exception in thread "pool-1-thread-4" java.lang.RuntimeException: 3:刷表失败

at step5.exception.LayerInitTask.run(LayerInitTask.java:23)

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

Exception in thread "main" java.lang.RuntimeException: 入库失败!

at step5.exception.ThreadException.main(ThreadException.java:27)

2:刷表成功

1:刷表成功

5:刷表成功

0:刷表成功

4:刷表成功

根据返回值捕获:exception

根据抛出异常捕获:exception

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java runnable 异常_详解Java中多线程异常捕获Runnable的实现相关推荐

  1. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  2. Java implement意思_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 发布于 2020-4-14| 复制链接 摘记: 详解JAVA中implement和extends的区别extends是继承父类,只要那个类不是声 ...

  3. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  4. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  5. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  6. java 标量替换_详解jvm中的标量替换

    概述 通常在java中创建一个对象,大家都认为是在堆中创建. 在jdk6开始有逃逸分析,标量替换等技术,关于在堆中创建对象不再绝对. 关于标量替换,通过以下几点进行概述: 逃逸分析 标量替换是什么 测 ...

  7. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

  8. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  9. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

最新文章

  1. python爬取虾米音乐_Python爬取620首虾米歌曲,揭秘五月天为什么狂吸粉?!
  2. 底部检测的do...while循环
  3. Ansible 一步一步从入门到精通(一)
  4. 解决:Failed to execute goal on project aopcore: Could not resolve dependencies for project com.cmos:
  5. Windows 7硬盘安装方法大全
  6. php和app关系,请教一下,app和微信 两个共通的问题
  7. Gaze Estimation学习笔记(1)-Appearance-Based Gaze Estimation in the Wild
  8. centos上TURN服务器搭建及测试
  9. WhatsApp + 聊天机器人= 转化率UP
  10. 国际市场营销知识框架图_留学热门 | 伦敦里士满大学市场营销本科专业
  11. UINO优锘:面向架构管理的可视化
  12. uva 10827 Maximum sum on a torus
  13. 模型优化论文笔记5----采用shuffled block和group convolutional的MBNet(71K)用于AMC
  14. python银行利息问题_python入门教程NO.8 用python写个存款利息计算器
  15. Java游戏项目之“超级玛丽”实战教程,终于可以制作属于自己的小游戏了
  16. 【EZSocket】卸载后未重启电脑,再安装后加密解密都不生效
  17. STM32F103+FFT+OLED25664的音乐频谱制作分享(继续干货)
  18. 项目实训2021.07.01
  19. C++构造函数基于Rectangle类并派生Cuboid长方体类
  20. U8修改消息任务内的单据显示模板

热门文章

  1. 程序员:世界杯梅西首战,我在工位看球被领导抓到了...... 丨黑马头条
  2. 2019年广东工业大学腾讯杯新生程序设计竞赛(同步赛)A-原初的信纸
  3. SpringAOP源码解析总结
  4. tapescripts的意思及音标,tapescripts怎么读英语
  5. 【Vue】MVVM模型,vue中的data、methods属性
  6. pyautogui: 有了Python键盘鼠标都可以省着用了
  7. js提交form表单,并传递参数
  8. 价格奥秘-在超市遇见亚当斯密--第七章 物价下降,谁才是最大赢家?
  9. 考研路上的那些一战二战三战成功与失败的故事系列之十七
  10. Java基础——Arrays类