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 的设计哲学和实现机制来决定的。
相关推荐
沉下去,苦磨练!15 小时前
实现二维数组反转
java·数据结构·算法
桦说编程16 小时前
实现一个简单的并发度控制执行器
java·后端·性能优化
wjs202416 小时前
MySQL 复制表
开发语言
Spring AI学习16 小时前
Spring AI深度解析(11/50):异常处理与容错机制实战
java·人工智能·spring
laocooon52385788616 小时前
相对名次算法的处理python
开发语言·python·算法
沐知全栈开发16 小时前
CSS Overflow
开发语言
星火开发设计16 小时前
Python冒泡排序详解:从原理到代码实现与优化
开发语言·笔记·python·开源·排序算法·课程设计
qq_124987075316 小时前
基于协同过滤算法的在线教育资源推荐平台的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·spring boot·spring·毕业设计
总是学不会.16 小时前
[特殊字符] 自动分区管理系统实践:让大型表维护更轻松
java·后端·数据库开发·开发
大筒木老辈子16 小时前
C++笔记---并发支持库(future)
java·c++·笔记