Java线程的学习_线程组

Java使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java语序程序直接对线程组进行控制。用户创建的所有线程都属于指定线程组,如果程序没有显式指定线程属于哪个线程组,则该线程属于默认线程组。在默认情况下,子线程和创建它的父线程处于同一个线程组内,例如A线程创建了B线程,并且没有指定B线程的线程组,则B线程属于A线程所在的线程组。
一旦某个线程加入了指定线程组之后,该线程将一直属于该线程,直到该线程死亡,线程运行途中不能改变它所属的线层组。

Thread类提供了如下构造器来设置新创建的线城属于哪个线程组:
--Thread(ThreadGroup group,Runnable target):以target的run()方法作为线程执行体创建新线程,属于group线程组。
--Thread(ThreadGroup group,Runnable target,String name):以target的run()方法作为线程执行体创建新线程,该线程属于group线程组,且线程名为name。
--Thread(ThreadGroup group,String name):创建新线程,新线程名为name,属于group线程组 。

因为中途不可改变线程所属的线程组,所以Thread类没有提供setThreadGroup()方法来改变线程所属的线程组,但提供了一个getThreadGroup()方法来返回线程所属的线程组,getThreadGroup()方法返回值是ThreadGroup对象,表示一个线程组。ThreadGroup类提供了了如下两个简单的构造器来创建实例。
--ThreadGroup(String name):以指定的线程组名字来创建新的线程组。
--ThreadGroup(ThreadGroup parent,String name):以指定的名字、指定的父线程创建一个新线程组。

上面两个构造器在创建线程组实例时都必须指定一个名字,也就是说,线程组总会具有一个字符串类型的名字,该名字可通过调用ThreadGroup的getName()方法来获取,但不允许改变线程组的名字。
ThreadGroup类提供了如下方法来操作整个线程组里的所有线程。
--int activeCount():返回此线程组中活动线程的数目。
--interrupt():中断此线程组中的所有线程。
--isDaemon():判断该线程组是否是后台线程组。
--setDaemon(boolean daemon):把该线程组设置成后台线程组。
--setMaxPriority(int pri):设置线程组的最高优先级。

代码演示:

class MyThread extends Thread{
    //提供指定线程名的构造器
    public MyThread(String name){
        super(name);
    }
    //提供指定线程名、线程组的构造器
    public MyThread(ThreadGroup group, String name){
        super(group,name);
    }
    public void run(){
        for(int i = 0; i < 20; i++){
            System.out.println(getName() + "线程的i变量" + i);
        }
    }
}
public class ThreadGroupTest {

    public static void main(String[] args){
        //获取主线程所在的线程组,这是所有线程默认的线程组
        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
        System.out.println("主线程组的名字:" + mainGroup.getName());
        System.out.println("主线程是否是后台线程组:" + mainGroup.isDaemon());
        new MyThread("主线程组的线程").start();
        ThreadGroup tg = new ThreadGroup("新线程组");
        tg.setDaemon(true);
        System.out.println("tg线程组是否是后台线程组:" + tg.isDaemon());
        MyThread tt = new MyThread(tg, "tg组的线程甲");
        tt.start();
        new MyThread(tg, "tg组的线程乙").start();
    }
}

此外,在ThreadGroup内还定义了一个很有用的方法:void uncaughtException(Thread t,Throwable e),该方法可以处理该线程组内的任意线程所抛出的未处理异常。

Thread.UncaughtExceptionHandler是Thread类的一个静态内部接口,该接口内只有一个方法:void uncaughtException(Thread t,Throwable e),该方法中的t代表出现异常的线程,而e代表该线程抛出的异常。
Thread类提供了如下两个方法来设置异常处理器。
--static setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler() eh):为该类线程类的所有线程实例设置默认的异常处理器。
--setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler() eh):为指定的线程实例设置异常处理器。

代码实现:

//定义自己的异常处理器
class MyExHandler implements Thread.UncaughtExceptionHandler{
    //实现UncaughtException()方法,该方法将处理线程的 未处理异常
    public void  uncaughtException(Thread t, Throwable e){
        System.out.println(t + "线程出现了异常:" + e);
    }
}
public class ExHandler {

    public static void main(String[] args){
        //设置主线程的异常处理器
        Thread.currentThread().setUncaughtExceptionHandler(new MyExHandler());
        int a = 5 / 0;
        System.out.println("程序正常结束!");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值