Thread.currentThread()和this的區別——《Java多線程編程核心技術》

前言:在閱讀《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日,下午。

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

 

比你優秀的人比你還努力,你有什麼資格不去奮鬥!

__一個有理想的程序員。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章