当我学习多线程核心技术这本书的时候,读代码实例的时候发现两个疑问
1.Thread.currentThread().getName()与this.getName()获得线程名称不同
2.this.getName()似乎都为 Thread-0..1...2.....
貌似是这样的结果 ,其实不然!!!!!!!!!!!!!
接下来我们就带着这两疑问,于是我自己写了个测试程序并且Debug跟踪源码
1)首先创建一个自定义的MyThread1线程,并且获得并打印出线程名称
public class MyThread1 extends Thread{
public MyThread1(){
System.out.println("Constructor 当前线程名称 From current:"+Thread.currentThread().getName());
System.out.println("Constructor 当前线程名称 From this:"+this.getName());
}
@Override
public void run() {
System.out.println("Run 当前线程名称 From current:"+Thread.currentThread().getName());
System.out.println("Run 当前线程名称 From this:"+this.getName());
}
}
2)然后编写一个测试类
public class TestThread {
public static void main(String[] args){
// 创建自定义线程对象
MyThread1 myThread1 = new MyThread1();
// 初始化Thread对象 这样方便调用start()
Thread thread = new Thread(myThread1);
// 初始化自定义线程名称
thread.setName("A");
// 开启线程
thread.start();
}
}
3)测试结果如下
结果-1.Constructor 当前线程名称 From current:main
结果-2.Constructor 当前线程名称 From this:Thread-0
结果-3.Run 当前线程名称 From current:A
结果-4.Run 当前线程名称 From this:Thread-0
4)疑问分析 (纯属个人理解不喜勿喷)
首先第一个疑问 1.Thread.currentThread().getName()与this.getName()获得线程名称不同
通过分析源码得到
①Thread.currentThread().getName()获得是当前被调用线程的名称 源码如图
首先构造方法是主线程main调用的 、当前自定义线程调用 run方法
所以得到结果-1和结果-3
那么这个this到底是什么呢 this不是代表这个MyThread实例吗??????????
这个分两种情况 如果 如下这样创建对象
// 创建自定义线程对象
MyThread1 myThread1 = new MyThread1();
// 初始化Thread对象 这样方便调用start()
Thread thread = new Thread(myThread1);
// 初始化自定义线程名称
thread.setName("A");
// 开启线程
thread.start();
分析:通过对Thread源码分析,这样创建对象是把myThread1 赋值给了 一个私有private Runnable target; target变量上,当thread启动线程并调用run的时候,实际上底层是target调用了run,this.getName()实际上返回的是target.getName(),
所以等于Thread-0 。。1.。。。2 ,而Thread.currentThread().getName()实际上是thread.getName() 源码如下图:
那么如果我们 直接创建MyThread的对象实例结果如何呢??????
1.修改代码如下:
public class TestThread {
public static void main(String[] args){
// 创建自定义线程对象
MyThread1 myThread1 = new MyThread1();
// 初始化自定义线程名称
myThread1.setName("A");
// 开启线程
myThread1.start();
}
}
2.结果如下:
Constructor this isAlive :false
结果-1.Constructor 当前线程名称 From current:main
mainThread isAlive :true
结果-2.Constructor 当前线程名称 From this:Thread-0
Run this isAlive :true
结果-3.Run 当前线程名称 From current:A
currentThread isAlive :true
结果-4.Run 当前线程名称 From this:A
构造方法不变因为当执行构造方法的时候,主要是main线程在活动,MyThread实例还没有创建
这回再看看run是不是 结果一样了 Thread.currentThread.getName()=A this.getName =A