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()来获取当前正在执行代码的线程对象。
- lambda 表达式也不可以,因为 lambda 表达式中的 this 指向外部类实例是有 lambda 的设计哲学和实现机制来决定的。