Java线程——线程组

在Java中,线程组是指java.lang.TheadGroup类的对象,每个线程都隶属于唯一的个线程组,这个线程组在线程创建时指定井在线程的整个生命期内都不能更改。可以通过调用包含ThreadGroup类型参数的Thread 类构造方法来指定线程所属的线程组: 若没有指定,则线程默认地隶属于名为main 的系统线程组。除了预建的系统线程组外,所有线程组都必须显式创建。

在Java中,除系统线程组外的每个线程组又隶属于另一个线程组,可以在创建线程组时指定其所隶属的线程组,若没有指定,则默认地隶属于系统线程组。这样,所有线程组组成了一棵以系统线程组为根的树。

在引入ThreadGroup类之后,我们在创建线程方面又多了几个可供选择的Thread类的构造力法。
(1)、Thread(ThreadGroup group,String name);: 创建一个隶属于线程组group 的线程,以name 为名称。
(2)、Thead(ThreadGroup group,Rumable target): 根据实现Runnable接口的target对象创建一个隶属于线程组group的线程。
(3)、Thread(TheadGrop group,Runnable target,String name); 根据实现 Rnnable接口的target 对象创建一个隶属于线程组group的线程以name 为名称。新线程以stackSize 为最大堆栈大小,如果超出则抛出StackOverflowError。stackSize参数具有高度的平台依赖性,在有些平台上不发挥作用。
此外,利用Thread类的getThreadGroup方法可以确定该线程属于哪一个线程组。例如,打印当前线程所在的线程组的名称:

System.out.println(Thread.currentThread().getThreadGroup().getName());

对ThreadGroup类的常用方法说明如下

ThreadGroup(String name ):创建一个线程组,以name 为名称。

ThreadGroup(ThreadGroup parent,String name) 创建个以parent 为父组的线程组,以name为名称。

int activeCount( ):获取本线程组中的活动线程数。

int ativeGropCount(): 获取本线程组中的活动线程组数。

int enumerate(Thread[ ] list):将本线程组,以及了线程组中的活动线程放入list数组中,返回实际放入数组中的线程数(数组容量可能不够存放全部的线程)。

int enumerate(Thead[] list,.boolean ecurse); 将本线程组中的活动线程放入list数组中,如果ecurse为true 则同时将子线程组中的活动线程放入list 数组中。返回实际放入数组中的线程数(数组容量可能不够存放全部的线程》。

int enumerate(ThredGroup list); 将本线程组,以及子线程组中的活动线程组放入list 数组中。返回实际放入数组中的线程组数(数组容量可能不够存放全部的线程组)。

int enumerate(ThreadGroup[] list.boolean recurse): 将本线程组中的活动线程组放入list 数组中,如果recurse 为true,则同时将子线程组中的活动线程组放入list数组中。返回实际放入数组中的线程组数(数组容量可能不够存放全部的线程组)。

void setMaxPrioity(int pri): 设省本线程组,以及子线程组中的所有线程房能拥的最高优先级。设置结果对已经拥有更高优先级的线程没有影响。如果试图对本线程组,以及子线程组中的线程投予比pri 更高的优先级,JVM 将自动将其降为pri。

int getMaxPrority( ): 获取本线程组,以及子线程组中的所有线程所能拥有的最高优先级。

String getName(): 获取线程组名称

ThreadGroup getParent( ): 获取父线程组。

void setDaemon(boolean daemon):设置本线程组,以及子线程组中的线程是否为守护线程。

boolean isDaemon() 返回本线程组,以及子线程组中的线程是否为守护线程。

void interrupt(); 对本线程组,以及子线程组的线程发出中断请求。

void list(); 将有关此线程组的信息打印到标准输出。

下面的例程演示线程组的常用方法。源代码如下:

public class TestThreadGroup
{
    public static void main(String[] args)
    {
        ThreadGroup tg1=new ThreadGroup("thread_group1");
        Thread thread1=new Thread(tg1,"thread1");
        Thread thread2=new Thread(tg1,"thread2");
        tg1.list();
        tg1.setDaemon(true);

        System.out.println(tg1.getName()+"的父线程组是:"+tg1.getParent().getName());
        thread1.start();

        Thread[] threadArray1=new Thread[tg1.activeCount()];
        tg1.enumerate(threadArray1,false);

        System.out.println(tg1.getName()+"的活动线程有:"+threadArray1.length);

        ThreadGroup[] threadGroupArray1=new ThreadGroup[tg1.activeGroupCount()];
        tg1.enumerate(threadGroupArray1,false);

        System.out.println(tg1.getName()+"的活动线程组有:"+threadGroupArray1.length);

        ThreadGroup tg2=new ThreadGroup(tg1,"thread_group2");

        Thread thread3=new Thread(tg2,"thread3");
        Thread thread4=new Thread(tg2,"thread4");
        tg2.list();

        tg2.setDaemon(true);
        System.out.println(tg2.getName()+"的父线程组是:"+tg2.getParent().getName());

        Thread[] threadArray2=new Thread[tg2.activeCount()];
        tg2.enumerate(threadArray2,false);

        System.out.println(tg2.getName()+"的活动线程有:"+threadArray2.length);
        ThreadGroup[] threadGroupArray2=new ThreadGroup[tg2.activeGroupCount()];

        tg2.enumerate(threadGroupArray2,false);
        System.out.println(tg2.getName()+"的活动线程组有:"+threadGroupArray2.length);
    }
}

运行结果如下:

E:\>java TestThreadGroup
java.lang.ThreadGroup[name=thread_group1,maxpri=10]
thread_group1的父线程组是:main
thread_group1的活动线程有:1
thread_group1的活动线程组有:0
java.lang.ThreadGroup[name=thread_group2,maxpri=10]
thread_group2的父线程组是:thread_group1
thread_group2的活动线程有:0
thread_group2的活动线程组有:0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值