lambda表达式本身不处理多线程,需配合线程机制或并行流实现并发;直接创建线程、使用executorservice提交任务、或调用parallelstream()进行集合并行处理是三种主要方式,且须注意线程安全。

Java 中 Lambda 表达式本身不处理多线程,它只是定义任务的简洁语法;真正实现并发执行,要靠它和线程创建机制或并行流的配合。关键不在“写法多酷”,而在“在哪用、怎么用才安全高效”。
直接创建线程执行 Lambda 任务
这是最基础的方式:把 Lambda 当作 Runnable 或 Callable 提交给线程或线程池。
- 用
Thread启动:new Thread(() -> System.out.println("运行在新线程")).start(); - 用
ExecutorService管理更稳妥:executor.submit(() -> doSomething());—— 避免手动管理线程生命周期,也便于复用和控制并发数 - 若需返回结果,用
Callable<string></string>:executor.submit(() -> { return "done"; });
用 parallelStream() 做集合级并行处理
适合对 List、Array 等批量数据做无状态计算(如转换、过滤、求和),底层走 ForkJoinPool,自动分片调度。
- 正确写法:
list.parallelStream().map(x -> x * 2).filter(x -> x > 10).collect(Collectors.toList()) - 别直接改外部变量:
int sum = 0; list.parallelStream().forEach(x -> sum += x);❌(结果不可靠) - 应改用归约操作:
int sum = list.parallelStream().mapToInt(Integer::intValue).sum();✅ - 小数据量(比如
避免共享可变状态,保证线程安全
Lambda 写得再短,一旦访问/修改非线程安全资源,就会出问题。
- 不要在 Lambda 里操作普通
ArrayList、HashMap、SimpleDateFormat等非线程安全类型 - 需要收集结果时,优先选线程安全收集器:
Collectors.toConcurrentMap()或Collectors.toList()(配合parallelStream()时内部已做线程隔离) - 必须同步访问共享变量?用
synchronized块或ReentrantLock包裹临界区,而不是依赖 Lambda 自身 - 日期格式化等场景,换用不可变且线程安全的
DateTimeFormatter
按需定制聚合逻辑:自定义 Collector
当标准 Collectors 不够用(比如要维护中间状态、做复杂合并),可实现 Collector 接口。
- 核心三部分:
supplier(每个线程新建私有容器)、accumulator(本线程累加)、combiner(合并各线程结果) - 这样能天然避开竞态,比在外层加锁更高效、更符合函数式风格
- 常见用途:统计分组后的最大值、带去重的并行拼接、自定义缓存聚合等
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











