Java 不同创建线程的方式什么时候才可以使用 this 来获取线程的引用

1.匿名内部类可以使用 this 来获取当前线程的引用

这里能使用 this 的原因与匿名内部类的继承机制有关。

java 复制代码
public static void main(String[] args) {
    Thread t = new Thread() {  // 🔥 关键在这里
        @Override
        public void run() {
            System.out.println(this.getName());           // 输出匿名类线程名
            System.out.println(Thread.currentThread().getName());  // 输出实际执行线程名
        }
    };
    t.start();
}

这段代码 new Thread () { ... } 的实际含义是:

java 复制代码
/ 等价于创建了一个 Thread 的匿名子类
class AnonymousThread extends Thread {  // 编译器生成的匿名类
    @Override
    public void run() {
        System.out.println(this.getName());  // this 指向 AnonymousThread 实例
        System.out.println(Thread.currentThread().getName());
    }
}

Thread t = new AnonymousThread();  // 创建匿名子类的实例

this 的指向规则

在匿名内部类中, this 的指向遵循以下规则:

匿名类的类型层次

因为匿名类继承了 Thread 类,所有它具有 Thread 的所有方法,包括 getName().

2.实现 Runnale ,不能用 this 来获取线程信息

java 复制代码
Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
        // ❌ this 指向 Runnable 匿名实现类,不是 Thread
        // System.out.println(this.getName());  // 编译错误!
        
        // ✅ 必须用 Thread.currentThread()
        System.out.println(Thread.currentThread().getName());
    }
});

等价于

java 复制代码
class AnonymousRunnable implements Runnable {  // 实现 Runnable
    @Override
    public void run() {
        // this 指向 AnonymousRunnable 实例,它只是 Runnable,不是 Thread
        // this.getName() 不存在!
        System.out.println(Thread.currentThread().getName());
    }
}
Thread t = new Thread(new AnonymousRunnable());

类型关系图解


运行时有两个独立对象

  • runnableTask:Runnable 接口的实现对象
  • t : Thread 线程对象

所以需要 Thread.currentThread()来获取当前正在执行代码的线程对象。

  1. lambda 表达式也不可以,因为 lambda 表达式中的 this 指向外部类实例是有 lambda 的设计哲学和实现机制来决定的。
相关推荐
oak隔壁找我8 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪12 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷13 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了16 小时前
Java 自动化部署
java·后端
ma_king16 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室16 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞20 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing21 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven971 天前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德1 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty