ThreadGroup 的基本操作

x33g5p2x  于2022-03-28 转载在 其他  
字(2.9k)|赞(0)|评价(0)|浏览(232)

一 基本操作

public int activeCount():用于获取 group 中活跃的线程,这只是估计值,并不能百分百地保证数字一定正确。

public int activeGroupCount():用于获取 group 中活跃的子 group,这也是一个估计值。该方法会递归获取所有子 group。

public final int getMaxPriority():用于获取 group 的优先级,默认情况下 Group 的优先级未 10,在该group 中,所有线程的优先级都不能大于 group 的优先级。

public final String getName():用于获取 group 的名字。

public final ThreadGroup getParent():用于获取group 的父 group,如果父 group 不存在,则会返回 null,比如 system group 的父 group 就是 null。

public void list():将 group 中所有活跃线程信息全部输出到控制台。

public final boolean parentOf(ThreadGroup g):判断当前 group 是不是给定 group 的父 group,另外如果给定的 group 就是自己本身,返回 true。

public final void setMaxPriority(int pri):指定 group 的最大优先级,最大优先级不能超过父 group 的最大优先级,执行该方法,不仅会改变当前 group 的最大优先级,还会改变所有子 group 的最大优先级。

二 实战1

1 代码

package concurrent;

import java.util.concurrent.TimeUnit;

public class ThreadGroupBasic {
    public static void main(String[] args) {
        ThreadGroup group = new ThreadGroup("group1");
        Thread thread = new Thread(group, () -> {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "thread");

        thread.setDaemon(true);
        thread.start();

        try {
            TimeUnit.MILLISECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();

        System.out.println("activeCount=" + mainGroup.activeCount());
        System.out.println("activeGroupCount=" + mainGroup.activeGroupCount());
        System.out.println("getMaxPriority=" + mainGroup.getMaxPriority());
        System.out.println("getName=" + mainGroup.getName());
        System.out.println("getParent=" + mainGroup.getParent());
        mainGroup.list();
        System.out.println("--------------------------------");
        System.out.println("parentOf" + mainGroup.parentOf(group));
        System.out.println("parentOf" + mainGroup.parentOf(mainGroup));
    }
}

2 测试

activeCount=3
activeGroupCount=1
getMaxPriority=10
getName=main
getParent=java.lang.ThreadGroup[name=system,maxpri=10]
java.lang.ThreadGroup[name=main,maxpri=10]
    Thread[main,5,main]
    Thread[Monitor Ctrl-Break,5,main]
    java.lang.ThreadGroup[name=group1,maxpri=10]
        Thread[thread,5,group1]

parentOftrue
parentOftrue

3 说明

线程的最大优先级不能高于所在线程组的最大优先级。

三 实战2

1 代码

package concurrent;

import java.util.concurrent.TimeUnit;

public class ThreadGroupPriority {
    public static void main(String[] args) {
        ThreadGroup group = new ThreadGroup("group1");
        Thread thread = new Thread(group, () -> {
            while (true) {
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "thread");

        thread.setDaemon(true);
        thread.start();

        System.out.println("group.getMaxPriority()=" + group.getMaxPriority());
        System.out.println("group.getPriority()=" + thread.getPriority());
        group.setMaxPriority(3);
        System.out.println("group.getMaxPriority()=" + group.getMaxPriority());
        System.out.println("group.getPriority()=" + thread.getPriority());
    }
}

2 测试

group.getMaxPriority()=10

group.getPriority()=5

group.getMaxPriority()=3

group.getPriority()=5

3 说明

虽然出现了已经加入该 group 的线程优先级大于 group 最大优先级的情况,但是后面加入该 group 的线程不会再大于新设置的值3.

相关文章