java中用匿名内部类创建runnable任务本质是省去单独定义类,直接在启动线程时就地实现接口;适合逻辑简单、一次性任务,但lambda更推荐且更轻量。

Java 中用匿名内部类创建 Runnable 任务,本质是省去单独定义类的步骤,直接在启动线程时“就地”实现接口。这种方式简洁、直观,适合逻辑简单、一次性使用的任务。
写法:new Runnable() { ... } + Thread.start()
核心语法就是用 new Runnable() { } 创建一个匿名子类实例,重写 run() 方法,再传给 Thread 构造器或直接用于线程池:
new Thread(new Runnable() { public void run() { System.out.println("Hello from thread"); } }).start();- 也可配合线程池:
executorService.submit(new Runnable() { public void run() { doWork(); } });
访问外部变量:只能用 final 或“事实 final”
匿名内部类能访问所在方法的局部变量,但该变量必须是 final(Java 8+ 放宽为“事实 final”,即定义后未被修改):
- ✅ 正确:
String msg = "Done"; new Runnable() { public void run() { System.out.println(msg); } }; - ❌ 错误:
String msg = "Done"; msg = "Changed"; // 后续修改会导致编译失败
替代方案对比:Lambda 更推荐(Java 8+)
匿名内部类写法略显冗长。若 Runnable 是函数式接口(只有一个抽象方法),可用 Lambda 表达式等价替换:
- 匿名类:
new Runnable() { public void run() { System.out.println("Hi"); } } - Lambda:
() -> System.out.println("Hi")—— 更轻量,语义更清晰 - 实际使用:
new Thread(() -> System.out.println("Hi")).start();
注意点:this 指向和生命周期
匿名内部类里的 this 指向的是该匿名类自身实例,不是外围类;它会隐式持有外围类的引用(如果定义在非静态上下文中),可能引发内存泄漏(尤其在长期运行的线程中):
- 避免在 Activity 或 Fragment 中用匿名类启动后台线程并持有所在实例
- 如需弱引用,可改用静态内部类 + WeakReference,或直接用 Lambda(不捕获实例成员时无强引用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











