Java中创建线程的三种匿名方式:1.继承Thread类重写run()并调用start();2.实现Runnable接口传入Thread构造器(更推荐);3.Java 8+用Lambda表达式简化,本质仍是Runnable实例,需注意内存泄漏与阻塞操作风险。

在 Java 中,可以使用匿名内部类的方式创建并启动线程,这种方式适合一次性、逻辑简单的线程任务,无需单独定义类。
继承 Thread 类的方式
通过匿名子类继承 Thread,重写 run() 方法,然后调用 start() 启动线程:
new Thread() {
@Override
public void run() {
System.out.println("线程正在运行:" + Thread.currentThread().getName());
}
}.start();
- 注意不能直接调用 run(),否则只是普通方法调用,不会开启新线程
- start() 才会真正触发 JVM 创建并调度新线程
实现 Runnable 接口的方式(更推荐)
匿名内部类实现 Runnable 接口,再传入 Thread 构造器,是更灵活、更符合面向接口编程习惯的做法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("通过 Runnable 启动:" + Thread.currentThread().getName());
}
}).start();
- 避免了单继承限制,便于后续扩展(比如该类还需继承其他类)
- 职责更清晰:Runnable 表示“可执行的任务”,Thread 表示“执行的载体”
Java 8+ 的简化写法(Lambda 表达式)
如果 Runnable 接口只有一个抽象方法(函数式接口),可用 Lambda 替代匿名内部类,代码更简洁:
立即学习“Java免费学习笔记(深入)”;
new Thread(() -> {
System.out.println("Lambda 启动线程:" + Thread.currentThread().getName());
}).start();
- Lambda 是匿名内部类的语法糖,本质仍是创建了 Runnable 实例
- 适用于逻辑简单、无复杂状态的场景;若需访问外部局部变量,变量必须是 final 或事实 final
注意事项
- 匿名内部类会隐式持有外部类的引用,若在线程中长期持有或发生内存泄漏风险,需留意生命周期
- 匿名内部类中的 this 指向的是该匿名类实例,不是外部类对象;如需访问外部类成员,可用 OuterClassName.this.field
- 不建议在匿名内部类中做耗时或阻塞操作(如 I/O、死循环),除非明确需要且已做好异常与中断处理


















