提出问题:

很多Java初学者在初学java 多线程的时候可能会看到如下代码:

public class ExceptionThread  implements  Runnable{

    @Override
    public void run() {
        throw new RuntimeException();
    }

    public static void main(String[] args) {
        try{
            ExecutorService exec= Executors.newCachedThreadPool();
            exec.execute(new ExceptionThread());
        }catch(RuntimeException e){
            System.out.println("Exception has been handled");
        }
    }
}

运行结果如下:

该代码已经try-catch捕获了异常,为何还是未执行System.out.println("Exception has been handled") ?

解答:

举个例子。

放学了,小朋友们排着队,跟着老师,走向校门口。老师停,学生停;老师走,学生走。瞎跑是不行的。

到了门口,来了二十个家长,接了二十个小朋友,各回各家,老师也回家了。

校内的路,老师和同学可以看作在一个线程内的,顺序执行,前边的停下来,后边的必须等。到了门口,家长接了,就等于分出了一个线程,二十个家长,二十个线程,每个线程负责把自己的孩子送回家,线程之间没有次序依赖,同时进行。

如果一个线程出了异常,比如跟家长回家的路上,一个小朋友跌倒了,要去医院。显然,这不影响其的小朋友回家,也不该归放了学的老师管。是由受伤小朋友的家长处理,也就是说,异常应由所在的线程处理,别的线程没有义务或上下文,来处理你的异常。

本质上来说,分一个线程,意味着不必等。就像老师不必等待所有孩子都到家才下班。不必等,意味着不知道其他线程的进度,也不必处理其他线程的问题。

孩子摔倒时,老师可能已经到家了,就好像题主的代码里,新线程里出异常,原线程可能已经跑完了。

我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。

最新文章

  1. SlidingMenu的简单使用
  2. 2015年10月份经常使用的linux命令。
  3. Unity学习疑问记录之正交与透视
  4. PHP5 mysqli 教程
  5. CCF真题之数列分段
  6. cpu,内存,虚拟内存,硬盘,缓存之间是什么关系??
  7. 用 CSS 实现字符串截断
  8. 排序算法总结(一)插入排序【Insertion Sort】
  9. Php output buffering缓存及程序缓存
  10. Creating Help Pages for ASP.NET Web API -摘自网络
  11. 从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux
  12. [CSS3] 学习笔记-CSS入门基本知识
  13. JavaFx新手教程-布局-StackPane
  14. 利用StackExchange.Redis和Log4Net构建日志队列
  15. 在ABP的Web层中实现复杂请求跨域访问
  16. 基础项目构建,引入web模块,完成一个简单的RESTful API 转载来自翟永超
  17. 【记一次pull request的惨痛教训】不可见的分隔符之Zero-with-space
  18. webpack-loader是怎样炼成的
  19. [转载] PNG优化插件:TinyPNG for Photoshop CC
  20. Markdown基础教程

热门文章

  1. MySQL性能优化(二):优化数据库的设计
  2. spring boot 发布自动生成svn版本号
  3. 关于ionic4导入android studio的注意事项
  4. 只读字段(readonly)和常量(const)
  5. springboot页面模板thymeleaf的简单用法
  6. JavaScript学习基础
  7. vue iview表格应用
  8. 本地远程调试Linux 部署的web 项目
  9. 安卓端调用h5界面js方法和ios端调用h5界面js方法
  10. dedecms 多级栏目时,调用上级栏目名称和链接