前言:在阅读《Java多线程编程核心技术》过程中,对书中程序代码Thread.currentThread()与this的区别有点混淆,这里记录下来,加深印象与理解。
具体代码如下:
1 public class MyThread09 extends Thread { 2 3 public MyThread09() { 4 System.out.println("MyThread09 Constructor begin"); 5 System.out.println("Thread.currentThread.getName()=" + Thread.currentThread().getName()); 6 System.out.println("this.getName()=" + this.getName()); 7 System.out.println("MyThread09 Constructor end"); 8 } 9 10 @Override11 public void run() {12 System.out.println("run begin");13 System.out.println("Thread.currentThread.getName()=" + Thread.currentThread().getName());14 System.out.println("this.getName()=" + this.getName());15 System.out.println("run end");16 17 }18 19 public static void main(String[] args) {20 MyThread09 thread = new MyThread09();21 // thread.setName("B");22 Thread thread1 = new Thread(thread);23 thread1.setName("A");24 thread1.start();25 }
输出结果如下:
分析:
这里将MyThread09的对象作为参数传递给Thread的构造函数,相当于将MyThread09线程委托给thread1去执行,理解这里是非常重要的。
在MyThread09的构造函数中打印如下内容:
1 MyThread09 Constructor begin2 Thread.currentThread.getName()=main3 this.getName()=Thread-04 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 begin2 Thread.currentThread.getName()=A3 this.getName()=Thread-04 run end
由于我们将MyThread09对象委托给thread1去执行的,所以此时Thread.currentThread.getName()=A,而此时this对象还是表示的MyThread09,所以this.getName()=Thread-0。
将21行注释打开,运行结果如下:
1 MyThread09 Constructor begin2 Thread.currentThread.getName()=main3 this.getName()=Thread-04 MyThread09 Constructor end5 run begin6 Thread.currentThread.getName()=A7 this.getName()=B8 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日,下午。