三、深入理解 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

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

被折叠的 条评论
为什么被折叠?



