Java多线程(五):多线程其他知识
来源:互联网 发布:两倍速播放软件 编辑:程序博客网 时间:2024/05/29 18:20
转载自:http://blog.csdn.net/lonelyroamer/article/details/7993502
一、线程组
- /**
- * 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
五、显示同步锁
- Java多线程(五):多线程其他知识
- Java多线程(五)、多线程其他知识简要介绍
- Java多线程(五)、多线程其他知识简要介绍
- Java多线程(五)、多线程其他知识简要介绍
- Java多线程(五)、多线程其他知识简要介绍
- Java多线程(五)、多线程其他知识简要介绍
- java多线程之其他知识简介
- Java 多线程(五) 多线程的同步
- Java 多线程(五) 多线程的同步
- 多线程知识巩固(五) 死锁
- Java核心技术(多线程)五
- JAVA多线程研究(五)
- JAVA基础 (五) 多线程
- Java多线程基础知识(五)
- java多线程基础(五)
- Java【多线程知识总结】
- Java多线程知识
- Java知识总结-多线程
- L0, L1, L2 范数的解析
- 安卓开发知识点学习笔记!
- QString QFile QTextStream QTextCodec
- python编辑器对比和推荐
- 汇编三步学习法(个人总结)
- Java多线程(五):多线程其他知识
- 汉诺塔递归算法理解及实现
- HDU2566(暴力枚举)
- 有关内存池的思考
- 折线分割平面(水题)
- 单一职责原则
- 五、回溯算法
- sql server 中的group by 和 having count
- 调试时,Lua的print函数输出的内容同时输出到VS的“输出窗口”中