那就取个昵称呗 2017-07-12 07:26 采纳率: 0%
浏览 633

关于《Thinking In Java》一书第四版并发一章的一个问题

《Thinking In Java》一书并发一章中关于捕获从线程中逃逸出的异常有这样一段代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

public class CaptureUncaughtException {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool(new HandlerThreadFactory());
exec.execute(new ExceptionThread2());
}
}

class ExceptionThread2 implements Runnable{

public void run() {
    // TODO Auto-generated method stub
    Thread t = Thread.currentThread();
    System.out.println("run() by " + t);
    System.out.println("eh = " + t.getUncaughtExceptionHandler());
    throw new RuntimeException();
}

}

class MyUncaughtExceptonHandler implements Thread.UncaughtExceptionHandler{

public void uncaughtException(Thread t, Throwable e) {
    // TODO Auto-generated method stub
    System.out.println("caught " + e);
}

}

class HandlerThreadFactory implements ThreadFactory{

public Thread newThread(Runnable r) {
    // TODO Auto-generated method stub
    System.out.println(this + " creating new Thread");
    Thread t = new Thread(r);
    System.out.println("created " + t);
    t.setUncaughtExceptionHandler(new MyUncaughtExceptonHandler());
    System.out.println("eh = " + t.getUncaughtExceptionHandler());
    return t;
}

}

按照代码的逻辑,运行结果应该是:
chapter_21.HandlerThreadFactory@4e25154f creating new Thread
created Thread[Thread-0,5,main]
eh = chapter_21.MyUncaughtExceptonHandler@70dea4e
run() by Thread[Thread-0,5,main]
eh = chapter_21.MyUncaughtExceptonHandler@70dea4e
caught java.lang.RuntimeException

但是我在自己的电脑上,不管是用jdk1.8还是Jdk1.7运行结果都是:
chapter_21.HandlerThreadFactory@4e25154f creating new Thread
created Thread[Thread-0,5,main]
eh = chapter_21.MyUncaughtExceptonHandler@70dea4e
run() by Thread[Thread-0,5,main]
eh = chapter_21.MyUncaughtExceptonHandler@70dea4e
chapter_21.HandlerThreadFactory@4e25154f creating new Thread
created Thread[Thread-1,5,main]
eh = chapter_21.MyUncaughtExceptonHandler@6c9ffdd2
caught java.lang.RuntimeException

HandlerThreadFactory类的newThread()方法出现了重复。我又在室友的机器上运行,而他的运行结果与预期结果相同,即没有这段重复的运行结果。这让我很疑惑,我觉得这应该与具体机器的线程调度机制有关,不知道有没有人能够帮我解答一下

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)