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