Java多線程中thread.getname()和thread.currentThread().getName();的去別

首先要明白 this.XXX 的使用場景 java

使用Thread.currentThread().getName()和使用this.getName()和 對象實例.getName(),均可以獲得線程的名稱,可是使用this調用getName()方法只能在本類中,而不能在其餘類中,更不能在Runnable接口中,因此只能使用Thread.currentThread().getName()獲取線程的名稱,不然會出現編譯時異常。
 
 
Thread.currentThread().getName()  ,對象實例.getName() 和 this.getName()區別
 
在繼承 Thread的 run方法中使用this.XXX 和在外部 調用  對象.XXX或者 Thread.currentThread().getXXX,所得出的結果不是同樣,以下面代碼  爲何不同 
 
1.new一個自定義的線程,而後把這個線程對象丟給Thread對象構造方法,執行start 纔會出現 上面的區別
2.若是是直接new一個自定義對象不交給 Thread線程執行調用 在其內部外部 使用 Thread.currentThread().getName()  ,對象實例.getName() 和 this.getName(),這3個區別 都不存在,都是相同的,由於沒有交給Thread執行,直接調用的當前實例自己
第一點代碼
  1. class DemoThread extends Thread{
  2. public DemoThread(){
  3. }
  4. @Override
  5. public void run() {
  6. super.run();
  7. System.out.println("內部 this.isAlive" + this.isAlive());
  8. System.out.println("內部 Thread.currentThread().isAlive()"+Thread.currentThread().isAlive());
  9. System.out.println("內部 this.getName" + this.getName());
  10. System.out.println("內部 Thread.currentThread().getName()"+Thread.currentThread().getName());
  11. }
  12. }
 
 
  1. public static void main(String[] args) throws InterruptedException {
  2. DemoThread d = new DemoThread();
  3. Thread t1 = new Thread(d);
  4. t1.setName("213");
  5. t1.start();
  6. System.out.println("外部t1.isAlive()"+t1.isAlive());
  7. System.out.println("外部t1.getName()"+t1.getName());
  8. }
 
結果
外部t1.isAlive()true
外部t1.getName()213
內部 this.isAlivefalse
內部 Thread.currentThread().isAlive()true
內部 this.getNameThread-0
內部 Thread.currentThread().getName()213
 
如上面圖所示  , 在 run方法中調用了 this.getXXX 和  Thread.currentThread().getXXX 徹底是不一樣的結果,而 Thread.currentThread().getXXX 和外部對象t1.getXXX的結果是一致的
 
總結
首先要清楚t1和d是兩個徹底不一樣的對象,他倆之間惟一的關係就是把d傳遞給t1對象僅僅是爲了讓t1調用d對象的run方法, 在run方法中 調用this.getXXX 獲取的是t1這個父類的狀態,父類沒有被重寫因此跟實例掉的不一樣的,而在外部t1.getName和Thread.currentThread().getXXX拿到的是d這個子類的實例,因此結果相同,正常的話按道理對象繼承父類this也應該實例的,set的話也是能夠設置到父類中的,至於爲何線程中會出現這種結果,重點仍是這句首先要清楚t1和d是兩個徹底不一樣的對象,他倆之間惟一的關係就是把d傳遞給t1對象僅僅是爲了讓t1調用d對象的run方法
 
綜上所述  調用線程若是是Thread繼承的方式 , 外部使用 Thread.currentThread().getXXX 或者 對象實例.getXXX()  內部則使用Thread.currentThread().getXXX 就不會出現獲取不一致的問題
 
ps一點:
上面的線程實現方法  是new一個自定義的線程,而後把這個線程對象丟給Thread執行 纔會出現 上面的區別,若是是直接new一個自定義對象不交給 Thread線程執行調用 在其內部外部 使用 Thread.currentThread().getName()  ,對象實例.getName() 和 this.getName(),這3個區別 都不存在,都是相同的,由於沒有交給Thread執行,直接調用的當前實例自己
相關文章
相關標籤/搜索