Thread中Thread.currentThread()与this的区别

 

当我学习多线程核心技术这本书的时候,读代码实例的时候发现两个疑问

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

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值