关于线程捕捉异常的问题

正在挖粪的少年 2017-01-24 12:25:00
class ExceptionThread2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
Thread t=Thread. currentThread();
System. out.println("线程正在运行");
throw new RuntimeException();
}
}

class MyUncaughtException implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t, Throwable e) {
System. out.println("异常捕获到了");

}
}

class HandlerThreadFactory implements ThreadFactory{
@Override
public Thread newThread(Runnable r) {
System. out.println("线程工厂");
Thread t= new Thread(r );
t.setUncaughtExceptionHandler( new MyUncaughtException());
return t ;
}
}
public class CaptrueUncaughtException {
public static void main(String args[]){
ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactory());
exec.execute(new ExceptionThread2());
}
}

以上部分是我根据《java编程思想》写的demo,按道理来讲输出的应该是
线程工厂
线程正在运行
异常捕获到了

而且书上也是这么讲的。
但是我实际上运行的结果却是
线程工厂
线程正在运行
线程工厂
异常捕获到了

也就是说线程工厂里的newThread方法又运行了一次,实在想不明白为何会这样。请指教!

...全文
288 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
L猫 2017-01-26
  • 打赏
  • 举报
回复
Executors.newCachedThreadPool换成Executors.newFixThreadPool(1).execute(r),试试
qq_25779665 2017-01-26
  • 打赏
  • 举报
回复
因为异常的工厂方法,其他线程的任务给工厂方法执行,当捕获到异常的时候,会输出“异常不会” 第一次输出是初始化,第二次是正式捕获到异常。 我也是新手,不知道说的对不对==

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧