并发编程核心——三.深入理解 Thread 构造器

本文详细探讨了Java中Thread构造器的各个方面,包括线程的命名、默认命名规则、如何自定义线程名,以及线程的父子关系。通过分析源码和示例,展示了线程默认以"Thread-"加自增数字的方式命名,并介绍了如何使用构造函数定制线程名。同时,文章还解释了Thread的父线程关系,指出所有线程由其他线程创建,创建线程默认加入父线程的ThreadGroup。此外,文章还讨论了Thread的StackSize参数对线程递归深度的影响,以及守护线程的概念和应用场景。

三、深入理解 Thread 构造器

在 Java 中的 Thread 为我们提供了比较丰富的构造函数,在本章中,我们将会逐一介 绍每一个构造函数,以及分析其中一些可能并未引起你关注的细节。Thread 构造函数如下 图:
在这里插入图片描述

3.1、线程的命名

我们构造线程的时候可以为线程起一个有特殊意义的名字,这也是比较好的一种做法, 尤其在线程比较多的程序中,为线程赋予一个包含特殊意义的名字有助于问题的排查和线程 的跟踪,根据这个特性,我们可以将构造器分别两种,一种是构建时可以指定线程名称的, 一种是使用线程默认名称的。

3.1.1、线程的默认命名

下面的几个构造函数,并没有提供为线程命名的参数,那么此时线程会有一个怎样的命 名呢?

Thread()
Thread (Runnable target)
Thread (ThreadGroup group, Runnable target)

打开 JDK 的源码会看到下面的代码:


/**
* Allocates a new {@code Thread} object. This constructor has the same * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread} * {@code (null, null, gname)}, where {@code gname} is a newly generated * name. Automatically generated names are of the form * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer.
*  */ 
* public Thread({
   
    
* 	this(null, null, "Thread-" + nextThreadNum(), 0);
*  }
/* For autonumbering anonymous threads. */
 private static int threadInitNumber; 
 private static synchronized int nextThreadNum() {
   
    return threadInitNumber++; }

如果没有为线程显示的指定一个名字,那么线程将会以“Thread-”作为前缀与一个自 增数字进行组合,这个自增数字在整个 JVM 进程中将会不断自增,且加了 synchronized 不 会出现重复的情况:

package com.bjsxt.chapter01;

public class TestConstructor0 {
   
   
    public static void main(String[] args) {
   
   
        for(int i = 0;i < 5;i++) {
   
   
            new Thread(){
   
   
                @Override
                public void run() {
   
   
                    System.out.println(Thread.currentThread().getName());
                }
            }.start();
        }
    }
}

执行上面的代码,我们通过无参构造函数创建了 5 个线程,并且分别输出了各自的名字, 发现输出结果与我们对源码的分析时一致的,结果如下:

在这里插入图片描述

3.1.2、命名线程

在线程比较多的程序中,为线程赋予一个包含特殊意义的名字有助于问题的排查和线程 的跟踪,Thread 同样提供了对应的构造函数,具体如下:

Thread (String name)
Thread (Runnable target, String name)
Thread (ThreadGroup group, Runnable target, String name)
Thread (ThreadGroup group, Runnable target, String name, long stackSize)
Thread (ThreadGroup group, Runnable target, String name, long stackSize, boolean inheritThreadLocals)
Thread (ThreadGroup group, String name)

实例代码如下:


public static void main(String[] args) {
   
    for (int i = 0; i < 5; i++) {
   
    new Thread(() -> System.out.println(Thread.currentThread().getName()), "MyThread-" + i).start(); } }

上面的代码中,我们定义了一个新的前缀“MyThread-”,然后用 0~4 之间的数字作 为后缀对线程进行了命名,代码执行输出的结果如下:
在这里插入图片描述

线程构造方法使用:

package com.bjsxt.chapter01;

/**
 * Thread 详解
 * 构造器
 *      有名称的线程
 *      匿名线程自动生成名称 Thread-数字
 */
public class TestConstructor01 {
   
   
    public static void main(String[] args) {
   
   
        // new Thread()
        Thread t1 = new Thread(){
   
   
            @Override
            public void run() {
   
   
                System.out.println(Thread.currentThread().getName());
            }
        };

        t1.start
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值