Java 不同创建线程的方式什么时候才可以使用 this 来获取线程的引用
1.匿名内部类可以使用 this 来获取当前线程的引用
这里能使用 this 的原因与匿名内部类的继承机制有关。
public static void main(String[] args) {Thread t = new Thread() { // 🔥 关键在这里@Overridepublic void run() {System.out.println(this.getName()); // 输出匿名类线程名System.out.println(Thread.currentThread().getName()); // 输出实际执行线程名}};t.start();
}
这段代码 new Thread () { ... } 的实际含义是:
/ 等价于创建了一个 Thread 的匿名子类
class AnonymousThread extends Thread { // 编译器生成的匿名类@Overridepublic 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 来获取线程信息
Thread t = new Thread(new Runnable() {@Overridepublic void run() {// ❌ this 指向 Runnable 匿名实现类,不是 Thread// System.out.println(this.getName()); // 编译错误!// ✅ 必须用 Thread.currentThread()System.out.println(Thread.currentThread().getName());}
});
等价于
class AnonymousRunnable implements Runnable { // 实现 Runnable@Overridepublic 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()来获取当前正在执行代码的线程对象。
3. lambda 表达式也不可以,因为 lambda 表达式中的 this 指向外部类实例是有 lambda 的设计哲学和实现机制来决定的。
