调用Thread类的方法:public final String getName() 为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?
2018-04-03 23:58
706 查看
调用Thread类的方法:public final String getName()
为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?
为什么得到的线程对象的名称默认是:Thread-0、Thread-1、Thread-2、...呢?
package cn.itcast_03; /* * Thread类的方法: * public final String getName() 获取线程对象的名称(放在需要被线程执行的代run()方法里面) * */ public class MyThreadDemo { public static void main(String[] args) { // 创建线程对象 // 无参构造 MyThread my1 = new MyThread(); MyThread my2 = new MyThread(); my1.start(); my2.start(); } }
package cn.itcast_03; public class MyThread extends Thread { public MyThread() { } // 需要被线程执行的代码 @Override public void run() { for (int x = 0; x < 100; x++) { System.out.println(getName() + ":" + x); } } }
我们查看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()方法得到线程对象的名称。
相关文章推荐
- (44)通过继承创建线程对象的例子+getName+setName+currentThread()方法应用介绍
- 只有线程在创建时命名,才可以用Thread.getName();方法获得名称。。。。
- 得到当前方法的名字Thread.currentThread().getStackTrace()[1].getMethodName();
- 得到当前方法的名字Thread.currentThread().getStackTrace()[1].getMethodName();
- 得到当前方法的名字Thread.currentThread().getStackTrace()[1].getMethodName();
- 【C#】开发的两个基本编程原则的深入讨论--为什么要用get,set,直接用public string Name不行吗
- Java中为什么匿名对象中方法,调用局部变量必须加final呢?
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- Java中Thread类currentThread获取多线程对象和为线程设置名称的方法
- 创建后,在命名线程,线程是final标识的,创建时添加线程名,后,还能用final void setName(String threadName);吗?
- Java - Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
- 一个对象toString()方法如果没有被重写,那么默认调用它的父类Object的toString()方法,而Object的toString()方法是打印该对象的hashCode,一般hashCode就是此对象的内存地址
- 深入理解final 类String 对象的创建以及内部方法
- 为什么Objective-C的对象“调用方法”叫做发消息。
- C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
- 对象的封装:public private protecte 访问修饰符+魔术方法__get(),__set()
- 为什么java要用get,set方法替代域的直接调用?
- MainActivity中为什么不能在自己创建的线程中调用控件的方法?
- 产品分类页面得到当前分类ID,产品详细信息页面得到当前产品默认商店的的商品名称 ---NAME
- 为什么匿名内部类调用的方法内局部变量必须为final