时间:2021-05-20
一、线程组
/** * A thread group represents a set of threads. In addition, a thread * group can also include other thread groups. The thread groups form * a tree in which every thread group except the initial thread group * has a parent. * <p> * A thread is allowed to access information about its own thread * group, but not to access information about its thread group's * parent thread group or any other thread groups. * * @author unascribed * @version 1.66, 03/13/08 * @since JDK1.0 */一个线程组代表了一系列的线程。并且,一个线程组可以包括其他的线程组。除了初始线程组外,每个线程组都有一个父线程组,类似于树的结构。
一个线程可以访问它所在线程组的信息, 不可以访问它父线程组和其他线程组的信息。
从这段话中可以大概明白线程组的概念,所有的线程和线程组构成一个树的结构,如下:
查看Thread的API,可以看到,创建一个线程可以指定它的线程组和不指定线程组。如果指定其所属的线程组,那么该线程组是创建它的线程所属线程组的子线程组。如果不指定线程组,则属于默认情况,该线程和创建它的线程在同一个线程组。
以上面的图举个简单的例子:
如果main线程创建了Thread1线程,没有指定Thread1所在的线程组,那么Thread1就默认和main线程属于同一个线程组,即系统线程组。
如果main线程创建了Thread3线程,没指定Thread3所在的线程组为线程组1,那么线程组1就属于系统线程组,和main线程在树结构中平级。
一旦某个线程加入了指定线程组之后,该线程将一直属于该线程组,直到该线程死亡,线程运行中途不能改变它所属的线程组。因为指定线程所在线程组是在创建线程的视乎完成的,所以之后不能再修改它所在的线程组。
下面是ThreadGroup的方法摘要
二、线程组与未处理的异常
从JDK1.5开始,Java加强了线程的异常处理,如果线程执行过程中抛出了一个未处理的异常,JVM在结束该线程之前会自动查找是否有对应的Thread.UncaughtExceptionHandler对象,如果找到该处理器对象,将会调用该对象的uncaughtException(Thread t,Throwable e)方法来处理该异常。
Thread.UncaughtExceptionHandler是Thread类的一个内部公共静态接口,该接口内只有一个方法:
void uncaughtException(Thread t,Throwable t),该方法中的t代表出现异常的线程,而e代表该线程抛出的异常。
Thread类提供了两个方法来设置异常处理器:
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh)线程类的所有线程实例设置默认的异常处理器
public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)为指定线程的实例设置异常处理器
ThreadGroup类实现了Thread.UncaughtExceptionHandler接口,所以每个线程所属的线程组将会作为默认的异常处理器。当一个线程抛出未处理的异常时,JVM会首先查找该异常对应的异常处理器(setUncaughtExceptionHandler方法设置的异常处理器),如果找到该异常处理器,将调用该异常处理器处理该异常,否则,JVM将会调用该线程所属的线程组对象的uncaughtException方法来处理该异常,线程组处理异常的流程如下:
1)、如果该线程组有父线程组,则调用父线程组的uncaughtException方法来处理该异常
2)、否则,如果该线程实例所属的线程类有默认的异常处理器(由setDefaultUncaughtExceptionHandler方法设置的异常处理器),那么就调用该异常处理器来处理该异常
3)、否则,将异常调试栈的信息打印到System.err错误输出流,并结束该线程。
看下面的例子:
class MyHandler implements Thread.UncaughtExceptionHandler{ @Override public void uncaughtException(Thread t, Throwable e) { System.out.println("出现了异常"); e.printStackTrace(); } } public class Test{ public static void main(String[] args) { Thread.currentThread().setUncaughtExceptionHandler(new MyHandler()); int a=1/0; } }在主线程中设置了异常处理器,最后捕获了异常。
以上所述是小编给大家介绍的Java多线程的其他知识_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java
在上篇文章给大家介绍了java多线程的实现方式,通过本文给大家介绍java多线程实例,对java多线程感兴趣的朋友一起学习吧首先给大家说下多线程的优缺点多线程的
一、java多线程基本入门java多线程编程还是比较重要的,在实际业务开发中经常要遇到这个问题。java多线程,传统创建线程的方式有两种。1、继承自Thread
本文承接上一篇文章《Java多线程实例详解(一)》。四.Java多线程的阻塞状态与线程控制上文已经提到Java阻塞的几种具体类型。下面分别看下引起Java线程阻
Java中CountDownLatch进行多线程同步详解CountDownLatch介绍在前面的Java学习笔记中,总结了Java中进行多线程同步的几个方法:1