Java中用匿名内部类创建线程本质是省略子类定义,直接实现run()方法;推荐实现Runnable接口以避免单继承限制,Java 8+更宜用Lambda表达式简化。

Java 中用匿名内部类创建线程,本质是省略了单独定义子类的步骤,直接在 new Thread(...) 或 new Thread(new Runnable(){...}) 中实现 run() 方法,适合一次性、逻辑简单的线程任务。
通过继承 Thread 类创建
直接 new 一个 Thread 的匿名子类,并重写 run() 方法:
new Thread() {
public void run() {
System.out.println("线程执行中:" + Thread.currentThread().getName());
// 具体任务逻辑
}
}.start();
说明:这种方式简洁,但因 Java 单继承限制,若当前类已继承其他类,就无法再继承 Thread,灵活性较低。
通过实现 Runnable 接口创建(推荐)
更常用的方式——传入一个 Runnable 匿名实例给 Thread 构造器:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
new Thread(new Runnable() {
public void run() {
System.out.println("任务运行在:" + Thread.currentThread().getName());
// 执行耗时操作,如文件读取、网络请求等
}
}).start();
优点包括:
- 不占用类的继承机会,可与已有继承体系共存
- 符合“组合优于继承”的设计原则
- Runnable 更聚焦于任务本身,职责更清晰
访问外部变量的注意事项
匿名内部类能访问所在方法的局部变量,但该变量必须是 有效 final(即事实上不可修改):
String msg = "Hello";
new Thread(new Runnable() {
public void run() {
System.out.println(msg); // ✅ 合法:msg 是 final 语义
}
}).start();
// msg = "World"; // ❌ 编译错误:不能在匿名类外修改
如果需要修改状态,可用包装类型(如 AtomicInteger)、数组(String[] msg = {"Hello"};)或成员变量替代。
Java 8+ 的 Lambda 替代方案
匿名内部类写法稍显冗长,JDK 8 起推荐用 Lambda 表达式简化:
new Thread(() -> {
System.out.println("Lambda 启动线程");
}).start();
Lambda 本质仍是函数式接口(如 Runnable)的实例,语义更简洁,且自动满足有效 final 约束。除非需调用 this 或访问外部类非 final 成员等特殊场景,否则优先选 Lambda。

















