Java多线程 5 多线程其他知识简要介绍
一、线程组
- /**
- * 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的方法摘要
方法摘要 | |
---|---|
int
|
activeCount() 返回此线程组中活动线程的估计数。 |
int
|
activeGroupCount() 返回此线程组中活动线程组的估计数。 |
boolean
|
allowThreadSuspension(boolean b) 已过时。 此调用的定义取决于 suspend() ,它被废弃了。更进一步地说,此调用的行为从不被指定。
|
void
|
checkAccess() 确定当前运行的线程是否有权修改此线程组。 |
void
|
destroy() 销毁此线程组及其所有子组。 |
int
|
enumerate(Thread[] list) 把此线程组及其子组中的所有活动线程复制到指定数组中。 |
int
|
enumerate(Thread[] list, boolean recurse) 把此线程组中的所有活动线程复制到指定数组中。 |
int
|
enumerate(ThreadGroup[] list) 把对此线程组中的所有活动子组的引用复制到指定数组中。 |
int
|
enumerate(ThreadGroup[] list, boolean recurse) 把对此线程组中的所有活动子组的引用复制到指定数组中。 |
int
|
getMaxPriority() 返回此线程组的最高优先级。 |
String
|
getName() 返回此线程组的名称。 |
ThreadGroup
|
getParent() 返回此线程组的父线程组。 |
void
|
interrupt() 中断此线程组中的所有线程。 |
boolean
|
isDaemon() 测试此线程组是否为一个后台程序线程组。 |
boolean
|
isDestroyed() 测试此线程组是否已经被销毁。 |
void
|
list() 将有关此线程组的信息打印到标准输出。 |
boolean
|
parentOf(ThreadGroup g) 测试此线程组是否为线程组参数或其祖先线程组之一。 |
void
|
resume() 已过时。 此方法只用于联合 Thread.suspend 和 ThreadGroup.suspend 时,因为它们所固有的容易导致死锁的特性,所以两者都已废弃。有关详细信息,请参阅 Thread.suspend() 。
|
void
|
setDaemon(boolean daemon) 更改此线程组的后台程序状态。 |
void
|
setMaxPriority(int pri) 设置线程组的最高优先级。 |
void
|
stop() 已过时。 此方法具有固有的不安全性。有关详细信息,请参阅 Thread.stop() 。
|
void
|
suspend() 已过时。 此方法容易导致死锁。有关详细信息,请参阅 Thread.suspend() 。
|
String
|
toString() 返回此线程组的字符串表示形式。 |
void
|
uncaughtException(Thread t,Throwable e) 当此线程组中的线程因为一个未捕获的异常而停止,并且线程没有安装特定 Thread.UncaughtExceptionHandler 时,由 Java Virtual Machine 调用此方法。
|
二、线程组与未处理的异常
从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;
- }
- }
在主线程中设置了异常处理器,最后捕获了异常。
三、Callable和Future
参考:http://lavasoft.blog.51cto.com/62575/222082
四、volatile关键字
参考:http://lavasoft.blog.51cto.com/62575/222076
五、显示同步锁
参考:http://lavasoft.blog.51cto.com/62575/222084
Java多线程 5 多线程其他知识简要介绍相关推荐
- Java中的多线程基本介绍
在 Java 中,多线程是指同时执行两个或多个线程以最大限度地利用 CPU 的过程. Java 中的线程是一个轻量级进程,只需要较少的资源即可创建和共享进程资源. 多线程和多进程用于 Java 中的多 ...
- JAVA实现环形缓冲多线程读取远程文件
2019独角兽企业重金招聘Python工程师标准>>> 如果用HttpURLConnection类的方法打开连接,然后用InputStream类获得输入流,再用BufferedInp ...
- Java— 齐头并进完成任务—多线程
感知多线程 Java是少数的几种支持"多线程"的语言之一.大多数的程序语言只能循序运行单独的一个程序块,无法同时运行不同的多个程序块.Java的"多线程"恰可弥 ...
- 100道Java并发和多线程面试题
1.多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡.所谓"知其然知其所以然","会用"只是 ...
- 【手把手带你学Java EE】多线程那些事,你了解了吗?
[手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...
- java面试(多线程)
1. Callable.Future.FutureTash详解 Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接口的 ...
- java面试题 多线程_Java面试常见关于多线程的面试题
多线程是Java技术中常用而且相对比较难易理解的一个知识点.而且多线程也是企业实际应用中必备的技术,因此在面试的过程中,面试者经常被问到关于多线程的问题,遇到这些问题大家应该怎么办呢?赶紧恶补一下Ja ...
- JAVA并发之多线程基础(5)
上面介绍了并发编程中的栅栏等JAVA并发之多线程基础(4) .通过唯一的一个终点线来帮助确定线程是多晚开始执行下一次操作. LockSupport 提供了一个比较底层的线程挂起操作.有点类似于susp ...
- java 内存模型 多线程_Java 高并发三:Java内存模型和线程安全详解
网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存.数据在主存中会有一份,在工作内存中也有一份.工作内存和主存之间会有各种原子操作去进行同步. 下图来源于这 ...
最新文章
- JDK 1.5 新特性——自动拆箱装箱
- 【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )
- laravel controller
- 由web程序出现乱码开始挖掘(Bom头、字符集与乱码)
- leetcode 第五题 Longest Palindromic Substring (java)
- 华为--NAT技术easy IP 原理配置or实验详解
- sshsecureshell登录Ubuntu出错,server responded “algorithm negotiation failed”
- 解决pr调用麦克风的问题
- 163微信邮箱在哪里找到,你知道微信邮箱地址在哪里找到吗
- Java gateway process exited before sending its port number
- 03:成绩排序 个人博客:doubleq.win
- 基于Java的商城购物系统
- 电路图中R1,D1有什么作用 ?
- 银行转账带来的死锁问题
- 在layui表格中显示图片
- 真正解决vbox不能为虚拟电脑打开一个新任务的解决方法
- SpringBoot 集成sharding-jdbc 提示:Failed to configure a DataSource: ‘url‘ attribute is not specified ***
- Android陀螺仪应用:平衡球小游戏
- 新生研讨课 课后心得
- 从入门到大神,表弟的Python 开发进击之路
热门文章
- C#(asp.net)实现目录(无扩展名)重写
- 安装VxWorks 6.6有感
- Survey Admin 示例:实现 Microsoft .NET 基于角色的安全性(转)
- ComputeColStats UDF中 近似算法的介绍(续)
- 《贝叶斯思维:统计建模的Python学习法》——2.5 封装框架
- 《版式设计——日本平面设计师参考手册》—第1章段落样式和字符样式的基础知识...
- 前端工程化和模块化学习资料汇总
- zabbix监控windows服务器简单介绍
- 【Arduino基础教程】PM2.5粉尘检测传感器
- Leetcode: Excel Sheet Column Number