线程组ThreadGroup

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):设置线程组的最高优先级。

下面创建了几条线程,它们分别属于不同的线程组,程序还将一个线程组设置成后台线程组。

package reptile;

class TestThread extends Thread {

    public TestThread(String name) {
        super(name);
    }

    public TestThread(ThreadGroup group, String name) {
        super(group, name);
    }
    @Override
    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 TestThread("主线程组的线程").start();
        ThreadGroup tg = new ThreadGroup("新线程组");
        tg.setDaemon(true);
        System.out.println("tg线程组是否是后台线程组:"+tg.isDaemon());
        TestThread tt = new TestThread(tg,"tg组的线程甲");
        tt.start();
        new TestThread(tg, "tg组的线程乙").start();
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值