java中可用lambda表达式创建runnable,因其是函数式接口;语法为() -> {代码块},可直接用于thread或executorservice;需满足“有效final”变量访问规则,且不可抛出受检异常。

Java 中用 Lambda 表达式创建 Runnable 很简单,核心是利用 Runnable 是函数式接口(只有一个抽象方法 run()),所以可以直接用箭头语法替代匿名内部类。
直接用 Lambda 替代匿名内部类
传统写法需要 new 一个类并重写 run 方法,而 Lambda 可以省掉模板代码:
- 老写法:
new Runnable() { public void run() { System.out.println("Hello"); } } - Lambda 写法:
() -> System.out.println("Hello")
括号表示无参数,箭头后是执行体。JVM 会自动将其适配为 Runnable 实例。
在 Thread 和 Executors 中直接使用
Lambda 可以无缝用于所有接受 Runnable 的地方:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 启动线程:
new Thread(() -> System.out.println("In thread")).start(); - 提交到线程池:
executorService.submit(() -> { doWork(); });
注意:如果要写多行逻辑,用大括号包裹,和普通代码块一样,但别忘了分号在 submit 或 Thread 调用末尾。
访问外部变量需满足“有效 final”条件
Lambda 可以引用所在作用域的局部变量,但该变量必须是“事实上的 final”(即定义后未被重新赋值):
- ✅ 允许:
String msg = "Done"; new Thread(() -> System.out.println(msg)).start(); - ❌ 编译错误:
String msg = "Done"; msg = "Changed"; new Thread(() -> System.out.println(msg)).start();
成员变量和静态变量不受此限制,可自由读写。
避免常见误区
有些写法看似简洁,实则隐藏问题:
- 不要在 Lambda 里直接抛出受检异常(如
IOException),因为run()方法不声明抛出任何异常;需用 try-catch 包裹 - 不要误写成
() -> { return System.out.println("Hi"); }——println返回 void,不能用 return,除非大括号内是单个表达式且无返回值 - 如果逻辑复杂或需复用,优先提取为命名方法,再用方法引用:
Thread t = new Thread(this::doHeavyTask);
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










