《Java程序员面试秘笈》—— 1.12 线程组中不可控异常的处理
本节书摘来异步社区《Java 7并发编程实战手册》一书中的第1章,第1.12节,作者:【西】Javier Fernández González,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.12 线程组中不可控异常的处理提供应用程序中对错误情景的管理,是编程语言很重要的一面。和几乎所有的现代编程语言一样,Java语言也实现了通过异常管理机制来处理错误情景,它提供了很多类来表示不同的错误。当错误情景发生时,Java类将抛出这些异常。你可以使用这些异常,或者实现自己的异常,来管理类中的错误。
Java也提供了捕获和处理这些异常的机制。有的异常必须被捕获,或者必须使用方法的throws声明再次抛出,这类异常叫做非运行时异常。还有一类异常叫做运行时异常,它们不需要被捕获或者声明抛出。
在本章1.5节中,我们学习了如何在线程对象中处理非捕获异常。
另一种可行的做法是,建立一个方法来捕获线程组中的任何线程对象抛出的非捕获异常。
本节中,我们将通过范例学习这种异常处理的方法。
准备工作
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。
范例实现
按照接下来的步骤实现本节的范例。
1.创建一个MyThreadGroup类,并继承ThreadGroup。必须声明带参数的构造器,因为ThreadGroup没有默认的不带参数的构造器。
public class MyThreadGroup extends ThreadGroup { public MyThreadGroup(String name) { super(name); 2.覆盖uncaughtException()方法。当线程组中的任何线程对象抛出异常的时候,这个方法就会被调用。在这里,这个方法将打印异常信息和抛出异常的线程代码到控制台,还将中断线程组中的其他线程。
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("The thread %s has thrown an Exception\n",t. getId());
e.printStackTrace(System.out);
System.out.printf("Terminating the rest of the Threadsn");
interrupt();
}`
3.创建一个Task类,它实现了Runnable接口。
``
public class Task implements Runnable {``
4.实现run()方法。在这个方法里,我们要触发AritmethicException异常。为了达到目标,我们用1000除以一个随机数,当随机数生成器生成0,异常将被抛出。
@Override public void run() { int result; Random random=new Random(Thread.currentThread().getId()); while (true) { result=1000/((int)(random.nextDouble()*1000)); System.out.printf("%s : %d\n",Thread.currentThread(). getId(),result); if (Thread.currentThread().isInterrupted()) { System.out.printf("%d : Interrupted\n",Thread. currentThread().getId()); return; 5.实现这个范例的主程序,并且实现main()方法。
public class Main {
public static void main(String[] args) {`
6.创建一个MyThreadGroup线程组类对象。
``
MyThreadGroup threadGroup=new MyThreadGroup("MyThreadGroup");``
7.创建一个Task类对象。
``
Task task=new Task();``
8.用刚创建的两个对象作为传入参数,创建两个线程对象。
for (int i=0; i i++){ Thread t=new Thread(threadGroup,task); t.start(); 9.运行范例并查看运行结果。 当运行范例的时候,你会看到当一个线程对象抛出了异常,其余的线程对象都被中断。 当线程抛出非捕获异常时,JVM将为这个异常寻找3种可能的处理器。 首先,寻找抛出这个异常的线程的非捕获异常处理器,参见1.9节。如果这个处理器不存在,JVM继续查找这个线程所在的线程组的非捕获异常处理器,这也是本节学习的知识。如果也不存在,JVM将寻找默认的非捕获异常处理器,参见1.9节。 如果这些处理器都不存在,JVM将把堆栈中异常信息打印到控制台,并且退出这个程序。
惊艳!Alibaba内部流行的“Java突击宝典”,程序员升职加薪必备 Alibaba作为一线互联网公司的代表,是大部分程序员梦寐以求的工作场所,确实大厂出来的程序员,其背景也更值钱,含金量也会更高。实际上,Alibaba程序员早已成为行业内学习的榜样和标杆,但实际上光鲜的背后付出的血汗是我们没看到的。那么阿里程序员平常都是怎么学习的呢?
进阶面试皆宜!阿里强推Java程序员进阶笔记,差距不止一点点 程序员要如何成长这个问题,一直是各大网站、论坛的热点。对此网络上众说纷纭,一千个读者里面就有一千个哈姆雷特。LZ觉得想要让个人技能成长速度,大于公司规模或业务的成长速度,不断优化自己,成为一名“不错”的程序员主要需要掌握以下学习方法与实战技巧。
年薪120W的架构师简历你见过吗?java程序员该如何达到? 第一个问题是,“大多数Java开发人员都在哪里,我们中有多少人?”我们回答了这个问题,把我们能得到的最准确的信息结合起来,然后推断出我们认为是一个受过良好教育的猜测。
最壕逆天改命:18名Java程序员凭阿里P8笔记,同时斩获大厂offer 上高中时由于看了一本《坏蛋怎么练成的》从此一发不可收拾,对小说的痴迷渐渐成了病态,上课看下课看,成绩一落千丈,还好高三幡然醒悟勉勉强强上了一个“野鸡”二本,学了所有男生都喜欢的计算机专业;
终于拿到了爆火全网的进一线大厂程序员必看的1700道java面试题 爆火全网的进一线大厂程序员必看的1700道java面试题到底有多牛? 牛不牛不敢说,但是有好多程序员是靠这一套1700道高频面试题,顺利收到很多大厂offer! 以至于,到现在为止,大厂都开始按照这一套1700道面试题来对程序员进行考核!
颜色填充(程序员面试金典08.10)Java深度优先遍历实现 编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。 待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor 。
「 代码性能优化 」作为一名Java程序员,你真的了解 synchronized 吗?(三) 文接上篇,本文将继续介绍 Synchronized,感兴趣的小伙伴继续跟博主一起讨论下。 更多、更体系化的内容请持续关注博主,您的 关注、点赞、收藏 都将是小编持续创作的动力!
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Java中的修饰符
- Java 获取字符串指定下标位置的值 charAt()
- Java容器 | 基于源码分析List集合体系
- java基础-java语言中的关键字总结
- 在 Ubuntu 20.04 上设置默认 Java 版本
- Java异常处理(Java必备知识)
- Java中如何进行异常处理?throws、throw、try、catch、finally分别如何使用?
- Java锁的种类以及辨析
- java 常用正则表达式匹配工具类RegExpUtil.java
- java.lang.VerifyError: Inconsistent stackmap frames at branch target
- 52 类 110 个常用 Java 组件和框架整理
- 一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目地址)
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
- Java面向对象中的异常
- Java 字符数组与字符串之间互相转换
- 【java】异常
- Java中集合Set的用法
- Java类加载器回顾
- java异常的分类
- 『Java练习生的自我修养』java-se进阶³ • 线程的等待与唤醒
- Fundebug后端Java异常监控插件更新至0.3.1,修复Maven下载失败的问题
- Java异常发生时程序的执行顺序
- 【J2EE之web应用】java集群概念
- Eclipse迅速执行:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
- java异常处理流程
- 【Java笔记】配置文件java.util.Properties类的使用