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 的设计哲学和实现机制来决定的。
相关推荐
Rain的Java大神之路15 分钟前
面了 50 个候选人,90% 都挂在 LeetCode 3 无重复字符的最长子串:滑动窗口的 5 个致命坑
java·后端·leetcode
西凉的悲伤16 分钟前
Jsoup 库 HTML 解析详解
java·前端·html·jsoup
qq_4017004122 分钟前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
星夜离尘5624 分钟前
MATLAB 角度解缠遇到丢样:先分段,再说明圈数为什么不可恢复
开发语言·matlab
十碗饭吃不饱28 分钟前
Apache POI 踩坑:setFontFamily 二次设置字体不生效、样式残留问题深度解析
java·word·apache
我命由我1234532 分钟前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee
ZoeLandia34 分钟前
React08:自定义 Hook
开发语言·前端·react.js·typescript
zaizai10071 小时前
STL深度剖析2
java·c++·算法
染指11101 小时前
157.Agent-LangGraph-工具(实现ReAct Agent模式)
开发语言·人工智能·python·langchain·agents
程序猿乐锅1 小时前
【从0-1学习Python | 第九篇】继承
开发语言·后端·python·学习·fastapi