lambda 表达式仅构造 runnable 任务对象,不创建线程;真正启动线程需 thread 或 executorservice。它简化单抽象方法接口实现,支持变量捕获(限 final 或事实 final),配合线程池实现高效、可持续的并发调度。

Lambda 表达式本身不创建线程,而是以极简方式构造 Runnable 任务对象——它把原本需要 5~6 行的匿名内部类,压缩成一行可读、可传、可调度的逻辑单元。真正启动和管理线程的,仍是 Thread 或更推荐的 ExecutorService。
基础写法:一行定义 Runnable 任务
只要接口只有一个抽象方法(如 Runnable.run()),Lambda 就能直接对应:
-
() -> System.out.println("Hello"):无参无返回,等价于run()方法体 - 单条语句可省略大括号和
return;多行需用花括号包裹,并注意Runnable不支持返回值 - 不能抛出未捕获的受检异常(如
IOException),必须在 Lambda 内部try-catch
结合 Thread 快速启动(适合简单场景)
适用于一次性、低频、调试类任务,不建议用于高频或生产环境:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
new Thread(() -> doWork()).start();:最简启动方式 -
new Thread(() -> doWork(), "数据处理线程").start();:命名便于日志追踪和问题定位 - 每次调用
start()都会创建新的 OS 级线程,开销大,不可复用
配合 ExecutorService 实现可持续调度
这才是实际开发中的标准做法,Lambda 让提交变得轻量又清晰:
- 创建线程池:
ExecutorService pool = Executors.newFixedThreadPool(4); - 提交无返回任务:
pool.execute(() -> saveToDB()); - 提交带返回结果的任务:
Future<string> f = pool.submit(() -> fetchResult());</string> - 任务可复用线程,自动排队、拒绝策略、优雅关闭(
pool.shutdown())都由线程池管理
变量捕获与线程安全提醒
Lambda 可访问外部局部变量,但有严格限制:
- 只允许访问 final 或 事实 final(声明后未再赋值)的变量
- 例如:
String msg = "OK"; new Thread(() -> log(msg)).start();✅ - 若需在线程间共享并修改状态,改用
AtomicInteger、ConcurrentHashMap等线程安全类型,避免竞态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










