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執行,直接調用的當前實例自己
第一點代碼
class DemoThread extends Thread{
public DemoThread(){
}
@Override
public void run() {
super.run();
System.out.println("內部 this.isAlive" + this.isAlive());
System.out.println("內部 Thread.currentThread().isAlive()"+Thread.currentThread().isAlive());
System.out.println("內部 this.getName" + this.getName());
System.out.println("內部 Thread.currentThread().getName()"+Thread.currentThread().getName());
}
}
public static void main(String[] args) throws InterruptedException {
DemoThread d = new DemoThread();
Thread t1 = new Thread(d);
t1.setName("213");
t1.start();
System.out.println("外部t1.isAlive()"+t1.isAlive());
System.out.println("外部t1.getName()"+t1.getName());
}
結果
外部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執行,直接調用的當前實例自己