1. 程式人生 > >Thread.currentThread().getName() ,對象實例.getName() 和 this.getName()區別

Thread.currentThread().getName() ,對象實例.getName() 和 this.getName()區別

是把 get set override extends -type 父類 rgs pos

原文鏈接:http://www.cnblogs.com/signheart/p/922dcf75dd5fe6b418d4475af89c4664.html

使用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執行,直接調用的當前實例本身

Thread.currentThread().getName() ,對象實例.getName() 和 this.getName()區別