java中用lambda表达式创建runnable本质是利用其函数式接口特性,通过() -> system.out.println("hello")替代匿名内部类,支持单语句、多语句及变量捕获,配合线程池使用更高效,但需手动处理受检异常。

Java 中用 Lambda 表达式创建 Runnable,本质是利用函数式接口特性,把原本需要匿名内部类写的线程任务,压缩成一行简洁代码。
Runnable 本身就是函数式接口
Runnable 接口只定义了一个抽象方法 run(),符合函数式接口要求(只有一个抽象方法),因此可以直接用 Lambda 表达式实现它:
- 传统写法(匿名内部类):
new Thread(new Runnable() {
public void run() {
System.out.println("Hello from thread");
}
}).start();
- Lambda 写法(等价、更简):
new Thread(() -> System.out.println("Hello from thread")).start();
Lambda 的几种常见写法
根据任务逻辑复杂度,Lambda 可以灵活展开:
- 单条语句:省略花括号和
return(run()无返回值,也无需return) - 多条语句:用花括号包裹,按普通代码块写
- 需要局部变量:Lambda 可访问所在作用域的 final 或事实 final 变量
例如:
String msg = "Running...";
new Thread(() -> {
System.out.println(msg);
try { Thread.sleep(1000); } catch (InterruptedException e) {}
System.out.println("Done");
}).start();
配合线程池使用更实用
实际开发中,直接 new Thread 较少,更多是提交给 ExecutorService。Lambda 让提交任务变得非常轻量:
- 用
Executors.newCachedThreadPool()等创建线程池 - 调用
execute(Runnable)方法传入 Lambda
示例:
ExecutorService pool = Executors.newFixedThreadPool(3);
pool.execute(() -> {
System.out.println("Task running in pool: " + Thread.currentThread().getName());
});
pool.shutdown();
注意变量捕获和异常处理
Lambda 内不能抛出受检异常(checked exception),因为 run() 方法签名不声明异常:
- 像
Thread.sleep()这种会抛InterruptedException的,必须在 Lambda 内用try-catch处理 - 不要试图在 Lambda 中
throws,编译不通过 - 若需传播异常,可封装为运行时异常(如
RuntimeException包装)
错误写法:() -> Thread.sleep(100)(编译失败)
正确写法:() -> { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











