线程组

一、

public class Main {
    public static void main(String[] args) {
        System.out.println("main thread: " + Thread.currentThread().getName());// 主线程组名称,输出:main
        ThreadGroup tGroup = new ThreadGroup("hahaTGroupName");
        System.out.println("custom thread: " + tGroup.getName());// 自定义线程组名称,输出:hahaTGroupName
        MyThread mThread = new MyThread();
        // 创建5个线程,并将该线程放入自定义线程组
        for (int i = 0; i < 5; i++) {
            Thread thread = new Thread(tGroup, mThread);// 这东东的构造方法超多
            thread.start();
        }
        System.out.println("嘻嘻");
        // 求出tGroup所拥有的线程数
        System.out.println("active count: " + tGroup.activeCount());
        // 列出tGroup里面有什么线程
        tGroup.list();// 卧槽,不用打印的,就这个方法,就打印出来了
    }
}

class MyThread implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("thread name: " + Thread.currentThread().getName());
            TimeUnit.SECONDS.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

二、

/*
 * 批量终止线程组内的线程
 */
public class Main2 extends Thread {
    
    public Main2(ThreadGroup tg, String name) {
        super(tg, name);
    }

    public void run() {
        System.out.println("ThreadName = " + Thread.currentThread().getName() + "准备开始死循环了");
        while (!this.isInterrupted()) {
            System.out.println(Thread.currentThread().getName() + "死循环中");
        }
        System.out.println("ThreadName = " + Thread.currentThread().getName() + "结束了");
    }

    public static void main(String[] args) throws InterruptedException {
        ThreadGroup tg = new ThreadGroup("我的线程组");
        Main2 mt = null;
        for (int i = 0; i < 3; i++) {
            mt = new Main2(tg, "线程" + i);
            mt.start();
        }
        Thread.sleep(2000);
        tg.interrupt();
        System.out.println("调用了interrupt()方法");
    }
}

三、

public class Main3 {
    public static void main(String[] args) {
        /*
         * 从结果看,实例化了一个group出来,没有指定线程组,那么自动归到当前线程所属的线程组中,也就是隐式地在一个线程组中添加了一个子线程组。
         */
        System.out.println("主线程名称:" + Thread.currentThread().getName()); 
        System.out.println("主线程所属的线程组名称:" + Thread.currentThread().getThreadGroup().getName());
        System.out.println("主线程所属的线程组里面有多少线程组:" + Thread.currentThread().getThreadGroup().activeGroupCount());
        ThreadGroup group = new ThreadGroup("新的组");
        System.out.println("主线程名称:" + Thread.currentThread().getName()); 
        System.out.println("主线程所属的线程组名称:" + Thread.currentThread().getThreadGroup().getName());
        System.out.println("主线程所属的线程组里面有多少线程组:" + Thread.currentThread().getThreadGroup().activeGroupCount());
        ThreadGroup[] tg = new ThreadGroup[Thread.currentThread().getThreadGroup().activeGroupCount()];
        Thread.currentThread().getThreadGroup().enumerate(tg);
        for (int i = 0; i < tg.length; i++)
            System.out.println("第一个线程组名称为:" + tg[i].getName());
        
        /*
         * 1、根线程组就是系统线程组system
         * 2、抛空指针异常是因为系统线程组上已经没有线程组了,所以system的getParent()方法返回的是null,对null调用getName()方法自然是NullPointerException
         */
        System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());
        System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent().getName());
    }
}

END:

原文地址:https://www.cnblogs.com/ericguoxiaofeng/p/9202562.html