Java中可用匿名内部类创建线程:Thread子类方式重写run(),Runnable方式传入实现对象,均须调用start();后者更推荐,符合面向接口编程;Java 8+可用Lambda简化;需注意局部变量限制与内存泄漏风险。

Java 中可以通过匿名内部类方式创建并启动线程,本质是重写 Thread 类的 run() 方法或实现 Runnable 接口,然后调用 start() 启动。
使用 Thread 匿名子类启动线程
直接继承 Thread,在 new 的同时定义 run() 方法体:
new Thread() {
public void run() {
System.out.println("线程正在运行:" + Thread.currentThread().getName());
}
}.start();
注意:必须调用 start(),不能直接调用 run(),否则只是普通方法调用,不会开启新线程。
使用 Runnable 匿名实现类启动线程
更推荐的方式——传入 Runnable 实现对象给 Thread 构造器:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
new Thread(new Runnable() {
public void run() {
System.out.println("通过 Runnable 启动:" + Thread.currentThread().getName());
}
}).start();
这种方式更符合面向接口编程思想,也便于复用和解耦。
Java 8+ 可用 Lambda 简化(补充说明)
虽然不是匿名内部类,但作为对比参考:当接口只有一个抽象方法(函数式接口),可用 Lambda 替代:
new Thread(() -> {
System.out.println("Lambda 启动线程");
}).start();
它本质上是编译器对 Runnable 匿名实现的语法糖,逻辑等价但更简洁。
常见误区提醒
- 匿名内部类访问外部局部变量时,该变量必须是 final 或事实 final(Java 8 起放宽限制,但不能在内部修改)
- 匿名内部类中若需使用外部对象,建议显式传参或捕获,避免隐式持有外部类引用导致内存泄漏(尤其在非静态上下文中)
- 每次
new Thread(...).start()都会创建一个新线程,频繁创建开销大,生产环境应优先考虑线程池
匿名内部类方式适合简单、一次性、逻辑短小的线程任务,写法直观,但不易复用和测试。实际开发中建议结合业务场景权衡使用。

















