首先要明白 this.XXX 的使用場景
使用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執行,直接調用的當前實例本身
第一點代碼
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執行,直接調用的當前實例本身