Java中通过匿名内部类创建线程本质是省略子类定义,推荐用Runnable匿名实现(组合优于继承),也可直接继承Thread(不推荐),Java 8+支持Lambda简化;务必调用start()而非run(),注意局部变量需有效final,高并发应优先使用线程池。

Java 中通过匿名内部类创建并启动线程,本质是省略了显式定义子类的步骤,直接在 new Thread(...) 时传入重写 run() 方法的实现。这种方式简洁,适合逻辑简单、只用一次的场景。
使用 Runnable 匿名内部类(推荐)
这是最常见也更灵活的方式,符合“组合优于继承”的原则,且避免单继承限制:
- 创建
Thread对象时,把Runnable匿名实现作为构造参数传入 - 在匿名类中重写
run()方法,写上要并发执行的代码 - 调用
start()启动线程(不能调用run(),否则是同步执行)
示例:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程正在运行:" + Thread.currentThread().getName());
}
}).start();
直接继承 Thread 的匿名内部类(不推荐)
虽然可行,但因 Java 不支持多继承,继承 Thread 会占用唯一的父类位置,扩展性差:
- 直接
new Thread() { ... },在花括号内重写run() - 同样必须调用
start()才能真正并发执行
示例:
new Thread() {
@Override
public void run() {
System.out.println("匿名子线程启动了");
}
}.start();
配合 Lambda 表达式(Java 8+,更简洁)
由于 Runnable 是函数式接口(只有一个抽象方法),可用 Lambda 替代匿名内部类,语义更清晰:
- 写法:
new Thread(() -> { /* 代码 */ }).start(); - 适用于逻辑较短的场景;若逻辑复杂,建议仍用命名类或方法引用
示例:
new Thread(() -> System.out.println("Lambda 启动的线程")).start();
注意事项和常见误区
快速写法容易忽略关键细节,导致“看似启动实则串行”或异常:
-
一定调用
start(),不是run()—— 后者只是普通方法调用,仍在当前线程执行 - 匿名内部类访问外部局部变量时,该变量必须是 有效 final(Java 8 起允许“事实不变”,即未被重新赋值)
- 匿名类中若需捕获异常,只能处理受检异常的子集(如
IOException),但run()方法本身不抛出异常,所以必须在内部 try-catch - 频繁使用匿名内部类创建线程不利于复用和管理,高并发场景应优先考虑线程池
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











