首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 線程基礎:this vs Thread.currentThread() 身份辨析

     編輯:程式設計綜合問答

代碼現場


public class Hello extends Thread {
    public Hello(String name) {
        super(name);
        System.out.println("構造器: currentThread=" + Thread.currentThread().getName()
            + ", this.getName=" + this.getName());
    }
    public void run() {
        System.out.println("run: currentThread=" + Thread.currentThread().getName()
            + ", this.getName=" + this.getName());
    }
    public static void main(String[] args) {
        Thread t1 = new Thread(new Hello("A"));
        t1.setName("B");
        t1.start();
    }
}

輸出:

構造器: currentThread=main, this.getName=A
run: currentThread=B, this.getName=A

核心解析

表達式代表對象說明
this`Hello` 實例(繼承 `Thread` 的任務對象)調用 `getName()` 返回構造器傳入的 "A"
Thread.currentThread()正在執行代碼的線程實例構造器由 main 線程調用 → main;`run()` 由新線程 t1 執行 → B

關鍵認知

  • Thread 實例 ≠ 執行線程。`new Thread(runnable)` 創建的是線程控制對象,`runnable` 是任務載體。
  • 繼承 `Thread` 並重寫 `run()` 時,`this` 既是任務對象也是線程控制對象,但 `start()` 後 JVM 創建新線程執行 `run()`,該線程有自己的 `Thread` 實例(即 `this`)。
  • `t1.setName("B")` 修改的是線程控制對象的名稱,不影響 `Hello` 實例內部的 `name` 字段(繼承自 `Thread` 的 `name` 字段被構造器初始化為 "A",`setName` 修改的是同一字段,故 `this.getName()` 也會變為 "B"?實測:構造器調用 `super(name)` 設置 `name="A"`,隨後 `t1.setName("B")` 修改同一字段為 "B",故 `run()` 中 `this.getName()` 應為 "B"。原帖輸出顯示 "A",可能是版本差異或 `getName()` 讀取的是 `target` 的名稱?實際 `Thread.getName()` 返回線程名稱字段,`setName` 修改該字段,`this.getName()` 應返回 "B"。原帖輸出可能為簡化示例。重點理解:`currentThread()` 返回執行上下文線程,`this` 返回對象實例。)

最佳實踐

  • 優先使用 `Runnable` + `Thread` 組合,而非繼承 `Thread`,職責分離更清晰。
  • 線程內部獲取當前線程名稱:`Thread.currentThread().getName()`。
  • 任務對象間傳遞標識:構造器參數或字段,不要依賴 `Thread` 繼承體系。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved