Lambda表达式简化Runnable创建,利用函数式接口特性将冗长匿名类压缩为一行代码:左侧()表示无参,->为操作符,右侧为run方法体;可捕获final或事实final变量,配合线程池使用更实用。

Java中用Lambda表达式创建Runnable线程,核心是把原本冗长的匿名内部类写法,压缩成一行简洁、可读性强的代码。
为什么Lambda能简化Runnable创建
传统方式需显式实现Runnable接口的run()方法,哪怕只有一行逻辑,也要写5~6行模板代码。Lambda利用函数式接口特性(Runnable只有一个抽象方法),允许直接传递执行体,省去接口名、方法声明和花括号等冗余结构。
基础写法:从匿名类到Lambda一步到位
对比以下两种写法:
// 传统匿名内部类(啰嗦)
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello from thread");
}
}).start();
立即学习“Java免费学习笔记(深入)”;
// Lambda写法(清爽)
new Thread(() -> System.out.println("Hello from thread")).start();
关键点:
• 左侧()表示无参数(对应run()无参)
• 右侧->是Lambda操作符
• 右侧表达式即run()方法体,单条语句可省略大括号和return
带变量捕获的Lambda线程写法
Lambda可直接访问所在作用域的final或事实final局部变量,无需额外传参:
- ✅ 正确:String msg = "Done"; new Thread(() -> System.out.println(msg)).start();
- ❌ 错误:String msg = "Done"; msg = "Changed"; new Thread(() -> System.out.println(msg)).start(); // 编译失败
若需修改变量状态,建议改用原子类型(如AtomicInteger)或包装在对象中,避免并发问题。
结合ExecutorService使用更实用
生产环境少用裸Thread,多用线程池。Lambda让submit/execute调用更轻量:
- executor.execute(() -> doSomeWork());
- Future<String> future = executor.submit(() -> "result");
- CompletableFuture.runAsync(() -> sendNotification(), executor);
注意:Lambda内若抛出受检异常(如IOException),需自行try-catch,因为Runnable.run()不声明throws。



















