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

 package com.xt.thinks21_2;

 import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* 线程异常捕获测试
*
* @author xue
*
*/
public class ThreadUncaughtExceptionTest implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
throw new NullPointerException();
} public static void main(String[] args) {
try {
ExecutorService es = Executors.newCachedThreadPool();
es.execute(new ThreadUncaughtExceptionTest());
es.shutdown();
// or this
// Thread t = new Thread(new ThreadUncaughtExceptionTest());
// t.start();
} catch (Exception e) {
// TODO: handle exception
} }
}

打印异常信息为:

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

 package com.xt.thinks21_2;

 import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory; /**
* 未捕获异常执行程序
*
* @author Administrator
*
*/
class ThreadUncaughtExceptionHandler implements UncaughtExceptionHandler { @Override
public void uncaughtException(Thread t, Throwable e) {
// TODO Auto-generated method stub
System.out.println("caught:" + e);
} } /**
* 线程工厂
*
* @author Administrator
*
*/
class HandlerThreadExceptionFactory implements ThreadFactory { @Override
public Thread newThread(Runnable r) {
// TODO Auto-generated method stub
Thread t = new Thread(r);
t.setUncaughtExceptionHandler(new ThreadUncaughtExceptionHandler());
return t;
} } /**
* 线程异常捕获测试
*
* @author xue
*
*/
public class ThreadUncaughtExceptionTest implements Runnable { @Override
public void run() {
// TODO Auto-generated method stub
throw new NullPointerException();
} public static void main(String[] args) {
ExecutorService es = Executors
.newCachedThreadPool(new HandlerThreadExceptionFactory());
es.execute(new ThreadUncaughtExceptionTest());
es.shutdown();
}
}

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

caught:java.lang.NullPointerException

JAVA并发,线程异常捕获的更多相关文章

  1. Java 并发 线程属性

    Java 并发 线程属性 @author ixenos 线程优先级 1.每当线程调度器有机会选择新线程时,首先选择具有较高优先级的线程 2.默认情况下,一个线程继承它的父线程的优先级 当在一个运行的线 ...

  2. Java 并发 线程同步

    Java 并发 线程同步 @author ixenos 同步 1.异步线程本身包含了执行时需要的数据和方法,不需要外部提供的资源和方法,在执行时也不关心与其并发执行的其他线程的状态和行为 2.然而,大 ...

  3. Java 并发 线程的优先级

    Java 并发 线程的优先级 @author ixenos 低优先级线程的执行时刻 1.在任意时刻,当有多个线程处于可运行状态时,运行系统总是挑选一个优先级最高的线程执行,只有当线程停止.退出或者由于 ...

  4. Java 并发 线程的生命周期

    Java 并发 线程的生命周期 @author ixenos 线程的生命周期 线程状态: a)     New 新建 b)     Runnable 可运行 c)     Running 运行 (调用 ...

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

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

  6. 从JDK源码角度看java并发线程的中断

    线程的定义给我们提供了并发执行多个任务的方式,大多数情况下我们会让每个任务都自行执行结束,这样能保证事务的一致性,但是有时我们希望在任务执行中取消任务,使线程停止.在java中要让线程安全.快速.可靠 ...

  7. java并发线程池---了解ThreadPoolExecutor就够了

    总结:线程池的特点是,在线程的数量=corePoolSize后,仅任务队列满了之后,才会从任务队列中取出一个任务,然后构造一个新的线程,循环往复直到线程数量达到maximumPoolSize执行拒绝策 ...

  8. JAVA Thread线程异常监控

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

  9. 关于java多线程中异常捕获的理解

    在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked e ...

随机推荐

  1. node.js 中的全局对象

    /** * Created by Administrator on 2016/8/29. */ const http = require("http"); const hostna ...

  2. the jar file rt.jar has no source attachment

    解决方法:rt的source在jdk目录的src.zip文件里,找到jdk目录下的src.zip,添加就行了.

  3. cocostudio中button

    在编辑器中使用Button控件调用setBright(false)函数控件会不显示 开始以为是代码哪调用了setVisible(false)就在底层函数void Node::setVisible(bo ...

  4. 浅谈C中的指针和数组(四)

    原文转载地址:http://see.xidian.edu.cn/cpp/html/476.html 在原文的基础上增加自己的思想作为自己的修改 指针数组和数组指针的内存布局 初学者总是分不出指针数组与 ...

  5. win7 64位安装 oracle 11G 和 使用 PLSQL Developer 连接服务器

    其实基本过程和网上大多数人的完全一样,只是后面的plsql上加了几张图片而已,以此给自己做个记录,万一网上的没了,这里自己还有,会了的大森(大神),就请路过吧 1.双击开始安装

  6. php中禁止非法调用和硬路径引入文件的方法

    php中禁止非法调用和硬路径引入文件的方法 在php中有一些公共的文件为了方便,我们会做一个公共文件,让不用的文件共同调用.为了禁止公共文件被非常单独调用,可以在文件上做一个常量,禁止非常调用:在公共 ...

  7. C#学习日志 day10 -------------- problem statement

    Revision History Date Issue Description Author 15/May/2015 1.0 Finish most of the designed function. ...

  8. @RISK

    Price: AUD $3,295.00   Price: AUD $2,495.00   适用于项目管理的 @RISK 免费试用版下载 » 立即购买 » 价格对比 » 许可选项 (英文) » 教学计 ...

  9. SelectDirectory使用方法以及EnableTaskWindows

    SelectDirectory使用方法 格式 Delphi syntax: On Windows: function SelectDirectory(const Caption: string; co ...

  10. Microsoft Azure 大计算 – 宣布收购 GreenButton

     数据以及令人不可思议的计算能力,正在改变我们日常业务的经营方式,从科学和工程到媒体和金融,各行各业的客户正逐渐意识到什么是可能的.我们对整个基因组进行分析,以研制新药物.我们构建金融和保险模型, ...