Java线程组

前面已经提过了关于线程池的一些常用方法。现在着重说一下ThreadGroup
线程组表示一个线程的集合,此外线程组也可以包含其他线程组。线程组构成一棵树,在树中 除了初始线程组外,每个线程组都有一个父线程组。
线程组的构造方法:

ThreadGroup(String name)
ThreadGroup(ThreadGroup parent,String name)

常用的方法如下:

activeCount():返回此线程组中活动线程的估计数
activeGroupCount():返回此线程组中活动线程组的估计数
enumerate(Thread[] list):把此线程组及其子组中的所有活动线程复制到指定数组中

用法举例:

int count=threadGroup.activeCount();
Thread[] t=new Thread[count];
threadGroup.enumerate(t);
若需要遍历该数据:
for(Thread thread:t){
System.out.println(thread.getName());
}

线程组比线程池的优势是可以了解线程的执行情况;而线程池比线程组的优势是对线程的管理。线程组的弊端是需要不断地创建线程 会增加内存开销

  public static void main(String[] args) throws InterruptedException {
        ThreadGroupDemo demo = new ThreadGroupDemo();
        ThreadGroup threadGroup = new ThreadGroup("abc");
        Thread t1 = new Thread(threadGroup, demo);
        Thread t2 = new Thread(threadGroup, demo);
        Thread t3 = new Thread(threadGroup, demo);
        Thread t4 = new Thread(threadGroup, demo);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        //Thread.sleep(2000);
        int count = threadGroup.activeCount();
        System.out.println("活跃线程数:" + count);
        System.out.println("活跃线程组数:" + threadGroup.activeGroupCount());
        Thread[] t = new Thread[count];
        threadGroup.enumerate(t);
        for (Thread thread : t) {
            System.out.println("活跃线程名称:" + thread.getName());
        }
    }

    @Override
    public void run() {
        synchronized (this) {
            int num = 3;
            while (num-- > 0) {
                System.out.println("线程名字:" + Thread.currentThread().getName() + " " + num);
            }
        }

    }

运行结果:
//将Thread.sleep注释
线程名字:Thread-0 2
活跃线程数:4
线程名字:Thread-0 1
活跃线程组数:0
活跃线程名称:Thread-0
活跃线程名称:Thread-1
线程名字:Thread-0 0
活跃线程名称:Thread-2
活跃线程名称:Thread-3
线程名字:Thread-1 2
线程名字:Thread-1 1
线程名字:Thread-1 0
线程名字:Thread-2 2
线程名字:Thread-2 1
线程名字:Thread-2 0
线程名字:Thread-3 2
线程名字:Thread-3 1
线程名字:Thread-3 0

将Thread.sleep(2000)这段代码放开,运行结果:
线程名字:Thread-0 2
线程名字:Thread-0 1
线程名字:Thread-0 0
线程名字:Thread-1 2
线程名字:Thread-1 1
线程名字:Thread-1 0
线程名字:Thread-3 2
线程名字:Thread-3 1
线程名字:Thread-3 0
线程名字:Thread-2 2
线程名字:Thread-2 1
线程名字:Thread-2 0
活跃线程数:0
活跃线程组数:0

运行结果不同的原因:不注释Thread.sleep(2000) sleep方法导致了主线程休眠,cpu的执行权被创建的几个线程抢去,所以2s之后线程均运行完成,也就没有活跃线程在线程组中了。而注释这句话,则会导致主线程和新创建的几个线程在互相的争夺cpu的执行权,所以会看到活跃线程在线程组中的现象

以上,若有什么错误,请指出 谢谢!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值