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 的设计哲学和实现机制来决定的。
相关推荐
hai_android4 分钟前
Kotlin Flow combine 源码剖析:一个 Channel 如何优雅合并多条流
android·java·kotlin
caoerzhong12 分钟前
JeeWMS 开源仓库管理系统权限与域验证解析:Java WMS 如何把数据权限管到仓、货主与人
java·python·开源·vue
君顾115 分钟前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
用户0942485680315 分钟前
第9章:OpenJDK堆分代与 Serial/Parallel GC 基础
java·jvm
Wang's Blog24 分钟前
Java框架快速入门: Spring Security+OAuth2之RBAC与角色分层实践
java·网络·spring
caoerzhong36 分钟前
JeeWMS 开源仓库管理系统多租户架构解析:一套 Java WMS 如何同时服务多个货主与多个仓库
java·架构·开源·vue
sunshine22 girl42 分钟前
Java学习四 面向对象原理
java
干到60岁退休的码农44 分钟前
15.创建获取用户接口与JWT认证器
java·spring boot·mybatis
小羊没烦恼!1 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
SL_staff1 小时前
战略落地的最后一公里:从目标到个人日历的自动化链路实现
java·github·全栈