线程组
java使用ThreadGroup来表示线程,它可以对一批线程进行分类管理,Java支持程序员直接对线程组进行管理控制。对线程组的控制相当于控制了这批线程。
一旦某个线程加入到某个线程组之后,该线程就一直属于该线程组,直到该线程死亡线程,线程运用途中不能改变它所属的线程组。
Thread类提供了以下构造器来设置新创建的线程属于哪个线程组
Thread(ThreadGroup group,Runnable targer):以targer的run()方法作为线程执行体创建新线程属于group线程组
Thread(ThreadGroup group,Runnable targer,String name):name线程名
Thread(ThreadGroup group,String name)
因为中途不可以改变线程所属的线程组,所以没有一个方法来改变线程所属的线程组,但提供了得到线程所属线程组的方法getThreadGroup()
ThreadGroup来提供了构造器创建实例
ThreadGroup(String name):name:线程组的名字
ThreadGroup(ThreadGroup group,String name):group父线程的名字
获取线程组的名字:ThreadGroup的getName()获取
ThreadGroup提供里几个常用方法
int activeCount():返回线程组中活动的线程数量
interrupt():中断线程组的所有线程
isDaemon():判断线程组是否为后台线程组
setDaemon(boolean daemon):设置线程组为后台线程组
setMaxPriority(int pri):设置线程组的优先级
class A extends Thread{
public A(String name){
super(name);
}
public A(ThreadGroup group,String name){
super(group,name);
}
@Override
public void run() {
for(int i=0;i<5;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+Thread.currentThread().getThreadGroup().getName()+"线程的i变量"+i);
}
}
}
public class Demo01{
public static void main(String[] args) {
//获取线程的所有线程组,这只所有默认的线程组
ThreadGroup group=Thread.currentThread().getThreadGroup();
System.out.println(group.getName());
System.out.println("主线程是否为后台线程"+group.isDaemon());
new A("主线程的线程").start();
//设置新的线程组
ThreadGroup group1=new ThreadGroup("性线程组");
//设置为后台线程
group1.setDaemon(true);
A a=new A(group1,"group1的线程甲");
a.start();
new A(group1,"group1的线程乙").start();
System.out.println("是否为后台线程"+group1.isDaemon());
}
}
异常处理
void uncaughtException(Thread t,Throwable e):ThreadGroup类定义的一个方法,该方法可以处理线程组中的仍以线程锁抛出的未处理异常,
Java5开始加强了线程异常处理,如果线程执行时抛出了一个未知处理异常,JVM在结束该线程之前会查找是否有对应的Thread.uncaughtExceptionHandler对象,如果有调用void uncaughtException(Thread t,Throwable e)方法处理异常
Thread类提供了如下方法来设置异常处理器
static setDefaughtuncaughtExceptionHandler(Thread.uncaughtExceptionHandler eh):为该线程类的所有线程实例设置默认为异常处理器
setDefaughtuncaughtException(Thread.uncaughtExceptionHandler eh):为指定的线程实例设置异常处理器。
ThreadGroup实现了Thread.uncaughtExceptionHandler接口
public class demo02 {
public static void main(String[] args) {
Thread.currentThread().setUncaughtExceptionHandler(new MyEXHandler());
int a=5/0;
System.out.println("线程结束");
}
}
class MyEXHandler implements Thread.UncaughtExceptionHandler{
//实现UncaughtExceptionHandler中的方法,该方法将处理线程未处理的异常
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t+"线程出现了异常"+e);
}
}