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<String> 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<String> errRet;public LayerInitTask(int num, Vector<String> errRet) {this.threadNum = num;this.errRet = errRet;}@Overridepublic 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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

团队项目冲刺第六天

昨日任务  对于关于我界面的 关于我们 的界面。今日任务完成功能介绍界面以及转换&#xff0c;并且在功能介绍界面增加特效&#xff0c;获取本机的时间&#xff0c;年月日星期几小时分钟 秒&#xff0c;可以看时间。明日任务完成联系我们的功能。困难在增加特效功能中一直获…

tf.cast

tf.cast(x, dtype, nameNone) 将x的类型转换为指定类型 import tensorflow as tf import numpy as np znp.array([0,1,3,4,6,4,7,1,0]) cast tf.cast(z,tf.float32)with tf.Session()as sess:print(z)print(sess.run(cast))输出 z的元素有整形变为浮点型

python 输入字符串_输入输出,字符串如影随形 | Python基础连载(五)

更好的排版阅读体验&#xff0c;请移步 微信端 开篇 前面两期详细的介绍了字符串及其相关操作&#xff0c;在今后的编程中&#xff0c;你将经常和字符串打交道。一个比较常见的场景就是输入输出&#xff0c;所以本期将结合字符串&#xff0c;讲述最基本同时也是最常用的输入输出…

linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

PATH和LD_LIBRARY_PATH本质都是变量&#xff0c;所谓变量的意思就是由别人赋值产生的&#xff0c;直觉往往会让我们添加和减少这个变量本身的某些路径&#xff0c;实际上这是不正确的。正确的做法是我们要去修改赋予这个变量数值的那些配置文件&#xff0c;加一条路径或者减一条…

BERT、MT-DNN、GPT2.0、ERNIE

目前效果较好的大部分的nlp任务都会应用预训练语言模型的迁移知识&#xff0c;主要是采用两阶段的模型。第一阶段进行预训练&#xff0c;一般是训练一个语言模型。最出名的是BERT,BERT的预训练阶段包括两个任务&#xff0c;一个是Masked Language Model&#xff0c;还有一个是N…

tf.argmax

tf.argmax可以认为就是np.argmax。tensorflow使用numpy实现的这个API 简单的说&#xff0c;tf.argmax就是返回最大的那个数值所在的下标。 test np.array([[1, 2, 3], [2, 3, 4], [5, 4, 3], [8, 7,2]])np.argmax(test, 0)   &#xff03;输出&#xff1a;array([3, 3, 1]…

guava 并发_Google Guava并发– ListenableFuture

guava 并发在上一篇文章中&#xff0c;我介绍了使用Guava库中com.google.common.util.concurrent包中的Monitor类的方法。 在这篇文章中&#xff0c;我将继续介绍Guava并发实用程序&#xff0c;并讨论ListenableFuture接口。 ListenableFuture通过添加接受完成侦听器的方法&…

mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成

近几个月的心情真是安排的妥妥的&#xff0c;呈现W状。多的不说了&#xff0c;这里对SQL的测试进行简单梳理&#xff0c;制作一份SQL Cheat Sheet。0x01、数据库基本架构Clinet层Server层连接器网络连接建立、管理长连接导致的OOM的自动处理权限管理缓存KV分析器词法分析语法分…

ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别

前记&#xff1a; jdk官方文档&#xff08;javadoc&#xff09;是学习的最好&#xff0c;最权威的参考。文章分上中下。上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别&#xff0c;池大小参数corePoolSize和maximumPoolSize&#xff0c;BlockingQueue选…

Apache Lucene 7.0即将发布!

Apache Lucene项目可能会在几个月后发布其下一个主要版本7.0&#xff01; 请记住&#xff0c;Lucene开发人员通常会努力为下一个非主要&#xff08;功能&#xff09;发行版移植新功能&#xff0c;而即将发布的6.5已经有了很多重大更改 &#xff0c;因此新的主要发行版令人兴奋…

windows常用服务命令

windows运行打开服务命令的方法 &#xff1a;在开始-》运行&#xff0c;输入以下命令 gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 explorer--…

springmvc 配置 tag lib_Java自学之springMVC:Hello Spring MVC

学习目的&#xff1a;初识SpringMVC&#xff0c;了解SpringMVC的工作原理Part 1新建一个动态web项目&#xff0c;命名为springMVC&#xff0c;在WEB-INF/lib中&#xff0c;添加所需要的jar包。Part 2在WEB-INF下新建一个web.xml。配置一个DispatcherServlet&#xff0c;所有的请…

GoogLeNet

GoogLeNetInception结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。对上图做以下说明&#xff1a; 1 . 采用不同大小的卷积核意味着不同大小的感受野&#xff0c;最后拼接意味着不同尺度特征的融合&#xff1b; 2 . 之所以卷积核大小采用1、3和5&#xff0c;主要是为…

1. ThreadPoolExecutor的一个常用的构造方法

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) 参数说明&#xff1a; -corePoolSize       线程池中所保存的核心线程数。线程池启动后默…

spring boot 启动卡住_SpringBoot集成的44种启动器,你知道几种?

点击蓝字“程序员考拉”欢迎关注&#xff01;啥是应用启动器&#xff1f;SpringBoot集成了spring的很多模块&#xff0c;比如tomcat、redis等等。你用SpringBoot搭建项目&#xff0c;只需要在pom.xml引入相关的依赖&#xff0c;和在配置文件中简单的配置就可以使用相应模块了。…

junit 经典示例_JUnit4参数化和理论示例

junit 经典示例我始终依靠TestNG将参数传递给测试方法&#xff0c;以便为我的测试或套件提供一些灵活性。 但是&#xff0c;使用JUnit4可以实现相同的灵活性。 要使用它很简单&#xff1a; package com.marco.test;import java.util.Arrays;import java.util.Collection;imp…

Spring+Hibernate+Atomikos集成构建JTA的分布式事务--解决多数据源跨库事务

一、概念 分布式事务 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简言之&#xff0c;同时操作多个数据库保持事务的统一&#xff0c;达到跨库事务的效果。 JTA JTA&#xff0c;即Java Transaction API&a…

spring el表达式 if else_Spring 获取单例流程(二)

读完这篇文章你将会收获到Spring 中 prototype 类型的 bean 如何做循环依赖检测Spring 中 singleton 类型的 bean 如何做循环依赖检测前言继上一篇文章 Spring 获取单例流程(一) 我们这次继续往下分析一下后面的流程上一篇文章中我们说到&#xff0c;首先我们根据 name 找到其对…

Apache Spark RDD和Java流

几个月前&#xff0c;我很幸运地参加了一些使用Apache Spark的PoC&#xff08;概念验证&#xff09;。 在这里&#xff0c;我有机会使用弹性分布式数据集&#xff08;简称RDD &#xff09;&#xff0c;转换和操作。 几天后&#xff0c;我意识到虽然Apache Spark和JDK是非常不同…

用脚本js把结果转化为固定小数位的形式

function roundTo(base,precision) {var mMath.pow(10,precision);var aMath.round(base * m) / m;return a; } 例如&#xff1a;给定数字n6.3241712&#xff0c;则用roundTo&#xff08;n,0&#xff09;得4&#xff0c;用roundTo(n,7)得到6.3241712转载于:https://www.cnblogs…