线程的父子关系以及线程组

本文深入解析了Java线程的初始化过程,强调了线程的父子关系和线程组的概念。通过源码分析,指出线程在未启动前属于创建它的线程的线程组,若未指定线程组,则默认继承父线程的线程组。测试代码和结果进一步证实了这一结论,展示了如何查看线程的线程组,并说明了线程组的默认设定和优先级继承特性。

一 Thread 源码

private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize, AccessControlContext acc,
                  boolean inheritThreadLocals) {
    if (name == null) {
        throw new NullPointerException("name cannot be null");
    }

    this.name = name;

    // 获取当前线程
    Thread parent = currentThread();
    SecurityManager security = System.getSecurityManager();
    if (g == null) {
        if (security != null) {
            g = security.getThreadGroup();
        }

        if (g == null) {
            g = parent.getThreadGroup();
        }
    }

    g.checkAccess();

    if (security != null) {
        if (isCCLOverridden(getClass())) {
            security.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
        }
    }

    g.addUnstarted();
    this.group = g;
    ......
}

二 线程的父子关系

Thread 的所有构造函数,最终都会去调用一个静态方法 init.

在线程生命周期中,线程的最初状态为 NEW,没有执行 start 方法之前,它只能算是一个 Thread 的实例,并不意味着一个新的线程被创建,因此 currentThread() 代表的将是创建它的那个线程,我们可以得出下面两个结论。

  • 一个线程的创建肯定是另外一个线程完成的。

  • 被创建线程的父线程是创建它的线程。

main 函数所在的线程是由 JVM 创建的,也就是 main 线程,那就意味着 main 线程创建的子线程,其父线程是 main 线程。

三 关于线程组

在 Thread 的构造函数中,可以显式地指定线程的 Group,也就是 ThreadGroup。

通过对源码分析,如果在构造 Thread 的时候没有显示指定一个 ThreadGroup,那么子线程线程组将被指定为父线程。

1 测试代码

package concurrent;

public class ThreadConstruction {
    public static void main(String[] args) {
        // a 没有指定线程组
        Thread t1 = new Thread("t1");

        // b 创建一个测试线程组
        ThreadGroup group = new ThreadGroup("TestGroup");

        // c 构造函数中指定线程组
        Thread t2 = new Thread(group, "t2");
        // main 线程的线程组
        ThreadGroup mainThreadGroup = Thread.currentThread().getThreadGroup();
        System.out.println("main 线程的线程组:" + mainThreadGroup);
        System.out.println("t1 线程的线程组:" + t1.getThreadGroup());
        System.out.println("t2 线程的线程组:" + t2.getThreadGroup());
    }
}

2 测试结果

main 线程的线程组:java.lang.ThreadGroup[name=main,maxpri=10]
t1 线程的线程组:java.lang.ThreadGroup[name=main,maxpri=10]
t2 线程的线程组:java.lang.ThreadGroup[name=TestGroup,maxpri=10]

3 结论

  • main 线程所在的 ThreadGroup 称为 main。

  • 构造一个线程的时候如果没有显示指定 ThreadGroup,那么它将会和父线程同属于一个 ThreadGroup。

在默认设置中,除了子线程会和父线程同属于一个 Group 外,它还会和父线程拥有同样的优先级,同样的 daemon。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值