前言:在閱讀《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 @Override 11 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 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行註釋打開,運行結果如下:
1 MyThread09 Constructor begin 2 Thread.currentThread.getName()=main 3 this.getName()=Thread-0 4 MyThread09 Constructor end 5 run begin 6 Thread.currentThread.getName()=A 7 this.getName()=B 8 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日,下午。
=========================================================
比你優秀的人比你還努力,你有什麼資格不去奮鬥!
__一個有理想的程序員。