Thread.currentThread()和this的区别---《Java多线程编程核心技术》

前言:在阅读《Java多线程编程核心技术》过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解。
具体代码如下:

public class MyThread09 extends Thread {

    public MyThread09() {
        System.out.println("MyThread09 Constructor begin");
        System.out.println("Thread.currentThread.getName()=" + Thread.currentThread().getName());
        System.out.println("this.getName()=" + this.getName());
        System.out.println("MyThread09 Constructor end");
    }

    @Override
    public void run() {
        System.out.println("run begin");
        System.out.println("Thread.currentThread.getName()=" + Thread.currentThread().getName());
        System.out.println("this.getName()=" + this.getName());
        System.out.println("run end");

    }

    public static void main(String[] args) {
        MyThread09 thread = new MyThread09();
//        thread.setName("B");
        Thread thread1 = new Thread(thread);
        thread1.setName("A");
        thread1.start();
}

输出结果如下:
在这里插入图片描述
分析:

这里将MyThread09的对象作为参数传递给Thread的构造函数,相当于将MyThread09线程委托给thread1去执行,理解这里是非常重要的。

在MyThread09的构造函数中打印如下内容:

1 MyThread09 Constructor begin
2 Thread.currentThread.getName()=main
3 this.getName()=Thread-0
4 MyThread09 Constructor end

第2行:当前线程名为main

第3行:this.getName()=Thread-0

首先看Thread.currentThread方法源码:
在这里插入图片描述
该方法为native的静态方法,返回正在执行该段代码的线程对象。

这里MyThread09的构造函数是由main线程执行的,所以Thread.currentThread.getName()=main

再看this.getName()=Thread-0.首先我们看Thread的构造函数源码:
在这里插入图片描述
在初始化线程对象的时候会默认为线程名赋值,格式为“Thread-”的形式。这里的this指的是当前对象,而当前对象就是MyThread09对象,所以打印Thread-0。

再看其run方法的打印日志:

1 run begin
2 Thread.currentThread.getName()=A
3 this.getName()=Thread-0
4 run end

由于我们将MyThread09对象委托给thread1去执行的,所以此时Thread.currentThread.getName()=A,而此时this对象还是表示的MyThread09,所以this.getName()=Thread-0。

将21行注释打开,运行结果如下:

MyThread09 Constructor begin
Thread.currentThread.getName()=main
this.getName()=Thread-0
MyThread09 Constructor end
run begin
Thread.currentThread.getName()=A
this.getName()=B
run end
在MyThread09执行构造函数时,还未调用setName方法,所以this.getName()=Thread-0,在执行run方法时,已为其赋值,所以this.getName()=B。

通过以上分析,可明确清楚Thread.currentThread和this的区别:

①Thread.currentThread表示当前代码段正在被哪个线程调用的相关信息。

②this表示的是当前对象,与Thread.currentThread有很大的区别。

by Shawn Chen,2018.12.5日,下午。

=========================================================

比你优秀的人比你还努力,你有什么资格不去奋斗!
__一个有理想的程序员。

=========================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值