java线程捕获异常
public class ExceptionThread2 implements Runnable {
@Override
public void run() {
Thread t = Thread.currentThread();
System.out.println("run() By" + t);
System.out.println("eh = " + t.getUncaughtExceptionHandler());
throw new RuntimeException();
}
}
如果我们用常用的try catch 去捕捉异常
package test.threadE; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ExceptionThread implements Runnable { @Override
public void run() {
throw new RuntimeException();
} public static void main(String[] args) {
try { ExecutorService exc = Executors.newCachedThreadPool();
exc.execute(new ExceptionThread());
System.out.println("主线程是可以执行到这的 只是出错的子线程被干掉了");
} catch (Exception e) {
System.err.println("捕获到异常了");
}
} }
控制台输出的结果 是捕捉不到错误的
Exception in thread "pool-1-thread-1" 主线程是可以执行到这的 只是出错的子线程被干掉了
java.lang.RuntimeException
at test.threadE.ExceptionThread.run(ExceptionThread.java:10)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
其实jdk5之前的解决办法是线程组,在jdk5之后 新引进了一个接口 Thread.UncaughtExceptionHandler 这个接口的作用就是为每个创建的线程都附着一个异常处理器,然后我们为了
使用到这个组件去创建线程,又引进了一个新的对象 ThreadFactory对象,这个也是一个接口,我们重写的方法newThread 就是它返回新线程的方法,在这个方法中为每个新创建的线程都设置 上面的Thread.UncaughtExceptionHandler,然后将带有异常处理器的线程返回看下面的代码
第一步:创建Thread.UncaughtExceprionhandler的实例
class MyUncaughtExceptionhandler implements Thread.UncaughtExceptionHandler {
/**
* 捕获异常 线程当中出现的异常 将在这里捕获
*/
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("caught " + e);
}
第二步:创建ThreadFactory
class HandelThreadFactory implements ThreadFactory{
/**
* 这是返回Thread 然后方法中是为每个线程设置UncaughtExceptionHandler 也就是上面的Thread.UncaughtExceptionHandler
*/
@Override
public Thread newThread(Runnable r) {
System.out.println(this+" creating new Thread");
Thread t = new Thread(r);
System.out.println("created " + t);
t.setUncaughtExceptionHandler(new MyUncaughtExceptionhandler());
System.out.println("eh = "+ t.getUncaughtExceptionHandler());
return t;
}
然后我们测试一下
public class CaptureUncaughtException {
public static void main(String[] args) {
/**
* 创建线程池的时候 把Threadfactory的实现类做参数传进来 。创建出的线程
* 每条的都会附着一个Thread.UncaughtExceptionhandler
*/
ExecutorService exc = Executors.newCachedThreadPool(new HandelThreadFactory());
exc.execute(new ExceptionThread());
exc.shutdown();
}
}看下控制台输出的结果
test.threadE.HandelThreadFactory@5c647e05 creating new Thread
created Thread[Thread-0,5,main]
eh = test.threadE.MyUncaughtExceptionhandler@33909752
caught java.lang.RuntimeException
这样就实现了 不会由于检查不到的运行时错误 导致线程意外死亡,我们也可以捕捉到这个运行时错误,方便我们统一管理 并且如果线程中需要释放资源的时候 我们可以写在 Thread.UncaughtExceptionHandler 实现类当中的UncaughtExceptionHandler方法中,这样线程就实现了 单独的执行的代码片段 自己出现的问题依靠自己解决,而不会跑该线程的外面。
java线程捕获异常的更多相关文章
- java 线程 捕获异常
java 线程 捕获异常 来自:thinking in java 4 文件夹20.2.13 package org.rui.thread.concurrent; import java.util.c ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- Java线程的5个使用技巧
萝卜白菜各有所爱.像小编我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法.比如说线程.没错,就是线程 ...
- Java线程面试题 Top 50 (转载)
转载自:http://www.cnblogs.com/dolphin0520/p/3958019.html 原文链接:http://www.importnew.com/12773.html 本文由 ...
- 50 道 Java 线程面试题(转载自牛客网)
下面是 Java 线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理 ...
- Java线程面试题 Top 50
转自:http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java ...
- 【多线程】Java线程面试题 Top 50(转载)
Java线程面试题 Top 50 原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎 ...
- Java线程面试题 Top 50(转载)
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末尾的 ...
- [ImportNew]Java线程面试题
Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关 ...
随机推荐
- Jmeter -- 入门,基础操作
1. 添加线程组 设置线程组参数(线程数.准备时长.循环次数等): a)线程数:虚拟用户数.一个虚拟用户占用一个进程或线程.设置多少虚拟用户数在这里也就是设置多少个线程数. b)Ramp-Up Per ...
- RedisTemplate 用法
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有 ...
- Java中for each与正常for循环效率对比
循环ArrayList时,普通for循环比foreach循环花费的时间要少一点:循环LinkList时,普通for循环比foreach循环花费的时间要多很多. 当我将循环次数提升到一百万次的时候,循环 ...
- centos6.9 samba配置
https://blog.csdn.net/qq_33468857/article/details/75431813 1 使用用户名密码访问 [global] security = user [hom ...
- XML文件报错dubbo:XX解决方法
特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...
- JSP——JSTL定制标签 - 递归标签显示属性结构
编写定制标签分为三个步骤:编写标签处理器.配置标签.使用标签. 1.标签处理器 标签处理器和标签是一一对应的关系 package com.oolong.utils.customtags; impo ...
- 使用 apt-get 清理
大多数使用基于 Debian 的系统的人通常会使用 apt-get 来安装软件包和升级,但是我们多久才清理一次?让我们看下该工具本身的一些清理选项. 在基于 Debian 的系统上运行 apt-get ...
- 编写个shell脚本将/home/test 目录下大于10K的文件转移到/tmp目录下
#!/bin/sh cd /home/test for i in `ls -l |awk '{if($5>10240) {print $9}}'` do mv $i /tmp done
- resultMap的使用总结
Mybatis:resultMap的使用总结 resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素 ...
- 慕课网_文件传输基础——Java IO流
第1章 文件的编码 1-1 文件的编码 (15:07) 第2章 File 类的使用 2-1 File 类常用 API 介绍 (10:50) import java.io.File; import ja ...