调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?

简介: 调用Thread类的方法:public final String getName()为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢? 1 package cn.

调用Thread类的方法:public final String getName()
为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?

 1 package cn.itcast_03;
 2 
 3 /*
 4  * Thread类的方法:
 5  *         public final String getName() 获取线程对象的名称(放在需要被线程执行的代run()方法里面)
 6  *         
 7  */
 8 public class MyThreadDemo {
 9     public static void main(String[] args) {
10         // 创建线程对象
11         // 无参构造
12         MyThread my1 = new MyThread();
13         MyThread my2 = new MyThread();
14         my1.start();
15         my2.start();
16     }
17 }
 1 package cn.itcast_03;
 2 
 3 public class MyThread extends Thread {
 4 
 5     public MyThread() {
 6     }
 7 
 8     // 需要被线程执行的代码
 9     @Override
10     public void run() {
11         for (int x = 0; x < 100; x++) {
12             System.out.println(getName() + ":" + x);
13         }
14     }
15 }
我们查看getName()方法的底层源码可知
(
): class Thread { private char name[]; public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null); } private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc) { //大部分代码被省略了 ... // 将传进来的name(name为字符串)转化为字符数组 this.name = name.toCharArray(); // this.name 指的是 private char name[]; // name.toCharArray(); 这句中的name是传递进来的name,是由"Thread-" + nextThreadNum()得到的name,nextThreadNum()方法第一次返回的是0,第二次返回的是1,... ... } private static int threadInitNumber; // 0, 1, 2 private static synchronized int nextThreadNum() { return threadInitNumber++; // 0, 1 注意:是后++  nextThreadNum()方法第一次返回的是0,第二次返回的是1,...   } public final String getName() { return String.valueOf(name); // String类的方法:把字符数组转为字符串 } } class MyThread extends Thread { public MyThread() { super(); } }

由以上可知,由
MyThread my1 = new MyThread();
第一次调用无参构造的时候,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的init() 方法,最终得到 Thread-0,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。
同理,
MyThread my2 = new MyThread();
第二次调用无参构造的时候,就会去父类thread 调用位无参构造,而父类的无参构造是一系列的init() 方法,最终得到 Thread-1,启动线程后,再通过Thread类的getName()方法得到线程对象的名称。

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
9天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
21 0
java基础(13)String类
|
6天前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
19天前
|
存储 安全 Java
Java——String类详解
String 是 Java 中的一个类,用于表示字符串,属于引用数据类型。字符串可以通过多种方式定义,如直接赋值、创建对象、传入 char 或 byte 类型数组。直接赋值会将字符串存储在串池中,复用相同的字符串以节省内存。String 类提供了丰富的方法,如比较(equals() 和 compareTo())、查找(charAt() 和 indexOf())、转换(valueOf() 和 format())、拆分(split())和截取(substring())。此外,还介绍了 StringBuilder 和 StringJoiner 类,前者用于高效拼接字符串,后者用于按指定格式拼接字符串
19 1
Java——String类详解
|
15天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
15天前
|
Java 索引
Java String 类详解
Java 中的 `String` 类用于表示不可变的字符序列,是 Java 标准库 `java.lang` 包的一部分。字符串对象一旦创建,其内容不可更改,修改会生成新对象。
|
9天前
|
Java 索引
java基础扫盲-String类常用的方法
java基础扫盲-String类常用的方法
|
29天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
2月前
|
API 索引
String类下常用API
String类下常用API
36 1
|
2月前
for循环和String类下方法的一个练习题
for循环和String类下方法的一个练习题
45 1
|
2月前
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?