前两天翻阅《Effective Java》发现一条提示慎用线程组。ThreadGroup提供的很多功能的实现是有瑕疵的。例如,我们可以调用activeCount获得该组中活动线程的数量,一旦这个数组进行了分配,并用enumerate方法遍历,如果线程数增加了,就有可能忽略掉调用activeCount后新增的线程。关于处理线程组逻辑,可以用线程池的executor代替。
也许ThreadGroup提供的有用的功能之一就是uncaughtException方法了。Java提供了强大的异常处理机制,有些异常可以通过try/catch捕获或者re-throw,这些都是checked exception,比如IOException和ClassNotFoundException,还有一些是不必要捕获处理的,如NumberFormatException.
在Java多线程中提供了一个层次化的机制帮助我们有效的处理uncaught exception. 当一个线程抛出异常时,JVM首先会调用thread里面指定的uncaught exception handler处理异常,如果在thread级没有设置handler,JVM会到当前线程所在的组的exception handler处理异常,如果线程组没有定义uncaughtException方法,JVM会继续寻找上一级的exception handler处理。如果一个handler都没有找到,这默认打出错误栈并推出程序。
让们看一个具体的例子:
import java.lang.Thread.UncaughtExceptionHandler;
public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Uncaught exception raised and captured in thread %s : \n", t.getName());
}
}
import java.lang.Thread.UncaughtExceptionHandler;
public class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Uncaught exception raised and captured in thread %s : \n", t.getName());
}
}
public class MyThreadGroupWithExceptionHandler extends ThreadGroup {
public MyThreadGroupWithExceptionHandler(String name) {
super(name);
}
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.printf("Uncaught exception caught in thread group's uncaughtException %s.\n",this.getName());
interrupt();
}
}
public class TestUncaughtException {
public static void main(String[] args){
MyTask task1 = new MyTask();
Thread t1 = new Thread(task1,"UncaughtException Task");
t1.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
t1.start();
MyThreadGroupWithExceptionHandler group1 = new MyThreadGroupWithExceptionHandler("mythread");
MyTask task2 = new MyTask();
Thread t2 = new Thread(group1, task2,"Task with group exception handler");
t2.start();
ThreadGroup group2 = new ThreadGroup("mythread");
MyTask task3 = new MyTask();
Thread.setDefaultUncaughtExceptionHandler(new MyDefaultExceptionHandler());
Thread t3 = new Thread(group2, task3, "Task with exception caught by Thread.default");
t3.start();
}
}
输出可见异常分别在Thread实例,ThreadGroup,Thread级别被捕获。
分享到:
相关推荐
"前端大厂最新面试题-controlled_Uncontrolled" Controlled 和 Uncontrolled 组件是 React 中两个重要的概念,它们之间的区别在于组件的状态管理方式和用户输入处理方式。 Controlled 组件 Controlled 组件是指...
React提供了两种主要的方式来管理表单状态:受控组件(Controlled Components)和非受控组件(Uncontrolled Components)。本资源"controlled-uncontrolled-forms-react-源码.rar"包含了这两种形式的React表单实现的...
单相不可控整流电路是电力电子技术中的基本组件,它在将交流电(AC)转换为直流电(DC)的过程中发挥着至关重要的作用。这种电路通常用于各种低功率电子设备中,比如充电器、电源适配器等。在本文中,我们将详细探讨...
受控和不受控制的React形式该项目是通过引导的。关于回购这个仓库包含了基于类和功能的组件,它们具有在React中使用表单的不同方法。 我使用了带有不同状态管理方法的受控和非受控形式示例。... 打开在浏览器中查看它。...
在电力电子领域,三相无控制整流器(UnControlled Rectifier)是一种常见的交流到直流转换装置。本文将深入探讨这种整流器的工作原理、特点,并结合MATLAB这一强大的数学计算软件,来分析和模拟当电感Ls为零时的运行...
这是连接电感时的整流三相电源模型。表示电感不为零。
《构建完整的语音识别系统:基于DARPA TIMIT与资源管理任务》 语音识别技术是人工智能领域中的一个重要分支,它涉及计算机科学、信号处理、语言学等多个学科,旨在让计算机能够理解和识别人类的口头语言。...
Create React App入门该项目是通过引导的。可用脚本在项目目录中,可以运行:npm start 在开发模式下运行该应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒...
12 pulse uncontrolled rectifier
response of uncontrolled building
在电子工程领域,线性变压器是转换电压的关键元件,它在电源设计中起着至关重要的作用。本主题将深入探讨如何在MATLAB环境中利用线性变压器实现电压降压,并通过GOTO和FROM块进行信号路由,同时利用虚拟仪器如万用表...
UnControlled包含一个简单的包装程序,该包装程序主要由codemirror本身的内部工作提供codemirror ,而Controlled则需要用户进行状态管理,除非通过value正确处理,否则它会阻止Codemirror进行更改。 后者将提供更多...
Based on the latest multi-view 3D reconstruction technology, it operates with arbitrary images and is efficient in both controlled and uncontrolled conditions. Photos can be taken from any position, ...
Based on the latest multi-view 3D reconstruction technology, it operates with arbitrary images and is efficient in both controlled and uncontrolled conditions. Photos can be taken from any position, ...
20篇英语专四的dictation训练 Dictation 1 Forest Fire森林火灾(150words) Forest fire or wildfire is often used to signify an uncontrolled intense fire/that breaks out ......
that they span test images taken under uncontrolled illumination. In order to evaluate how our algorithms work under practical testing conditions, we have implemented a complete face recognition ...
三种倒立摆系统的代码及simulink... disp('system is uncontrolled.') end Vo=obsv(A,C); ro=rank(Vo); if ro==n disp('system is observable.') elseif ro~=n disp('system is no observable.') end
接着,React中的输入输出处理被细分为受控(controlled)与非受控(uncontrolled)组件的使用,其中受控组件通过状态管理来控制输入值,而非受控组件则更多依赖于DOM自身状态。 在数据流方面,本书介绍了单向数据流...