Java中用匿名内部类创建线程的核心是省去单独定义子类,推荐实现Runnable接口以保留继承权并符合面向接口编程;也可继承Thread类(少用);Java 8+支持Lambda简化写法;需注意内存泄漏、变量有效性及异常处理。

Java 中用匿名内部类创建线程,核心是省去单独定义子类的步骤,直接在 new Thread(...) 或 new Thread(new Runnable() {...}) 里写执行逻辑,适合一次性、逻辑简单的任务。
用匿名内部类实现 Runnable 接口(推荐)
这是最常用也更灵活的方式,避免继承 Thread 类,保留类的继承权,也符合面向接口编程习惯。
- 直接传入
new Runnable() { public void run() { ... } }作为Thread构造参数 -
run()方法里写要并发执行的代码,比如打印、计算、休眠等 - 记得调用
start()启动线程,不能直接调用run()
示例:
new Thread(new Runnable() {
public void run() {
System.out.println("线程正在运行:" + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}).start();
继承 Thread 类的匿名内部类(少用)
直接 new Thread() { public void run() { ... } },重写 run() 方法。语法更短,但限制了类的继承能力,一般不推荐。
立即学习“Java免费学习笔记(深入)”;
- 适用于极简场景,且当前类无需再继承其他类
- 注意:匿名子类仍需显式调用
start()
示例:
new Thread() {
public void run() {
System.out.println("匿名 Thread 线程启动");
}
}.start();
配合 Lambda 表达式(Java 8+,更简洁)
因为 Runnable 是函数式接口(只有一个抽象方法),匿名内部类可被 Lambda 替代,代码大幅简化:
-
() -> { /* 执行体 */ }直接代替整个new Runnable() { ... } - 单条语句还可省略大括号和分号,例如
() -> System.out.println("Hello")
示例:
new Thread(() -> {
System.out.println("Lambda 创建的线程");
}).start();
注意事项和常见坑
匿名内部类本质仍是类,会隐式持有外部类引用,若在线程中长期持有或发生逃逸,可能引发内存泄漏(尤其在 Activity、Servlet 等有生命周期的场景)。
- 避免在匿名内部类中直接访问外部类的非
final实例变量(Java 8+ 要求“effectively final”) - 若需共享数据,优先用局部变量、原子类或线程安全容器
- 异常处理别遗漏:匿名类中的
try-catch要覆盖所有受检异常,且线程内未捕获的运行时异常会导致线程静默终止
不复杂但容易忽略。


















