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 的设计哲学和实现机制来决定的。
相关推荐
隐积3 小时前
3.1.7.Qt容器大家族(3):QVariant——万能盒子
开发语言·qt
都叫我大帅哥6 小时前
Java JJWT 完全指南:从入门到生产级实践
java
名字还没想好☜6 小时前
Next.js ‘use client‘ 到底加在哪:Server/Client Components 边界与常见报错
开发语言·前端·javascript·react·next.js
初级代码游戏7 小时前
iOS开发 Swift 速记1:变量和基本数据类型
开发语言·ios·swift
前端开发张小七7 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
酷在前行8 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言
ThsPool8 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
cxr8288 小时前
Graphify vs GitNexus vs CodeGraph — 三工具架构深度对比
开发语言·架构·知识图谱
赤壁小虾8 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
废弃的小码农9 小时前
功能测试--Day07--Python编程基础
开发语言·python