Java中Lambda创建多线程任务本质是利用Runnable函数式接口简化匿名内部类写法,一行即可启动线程,支持命名、访问final变量、配合线程池使用,并需注意异常处理与循环变量陷阱。

Java 中用 Lambda 表达式创建多线程任务,本质是利用 Runnable 是函数式接口这一特性,把原本冗长的匿名内部类写法压缩成一行简洁、可读性强的代码。它不改变线程执行逻辑,只大幅简化写法。
基本写法:一行启动一个线程
只需传入一个无参 Lambda 到 Thread 构造器,再调用 start():
new Thread(() -> System.out.println("任务已执行")).start();- 左侧
()对应run()方法的空参数列表 - 右侧
->后是线程体,单语句可省略花括号和分号 - 如果要命名线程,可加第二个字符串参数:
new Thread(() -> {...}, "Worker-1").start();
带局部变量的任务写法
Lambda 可访问所在作用域中 final 或事实 final 的局部变量(即定义后未被重新赋值):
- ✅ 正确:
String msg = "完成"; new Thread(() -> System.out.println(msg)).start(); - ❌ 错误:
String msg = "完成"; msg = "失败"; new Thread(() -> System.out.println(msg)).start();(编译报错) - 若需修改状态,建议用
AtomicInteger、AtomicReference或封装在对象里
配合线程池使用更实用
单独用 new Thread(...).start() 适合简单场景;生产环境推荐搭配线程池,Lambda 在这里依然高效简洁:
立即学习“Java免费学习笔记(深入)”;
ExecutorService pool = Executors.newFixedThreadPool(3);pool.submit(() -> { System.out.println("池中任务"); });pool.execute(() -> doSomething()); // execute 接收 Runnable,submit 还支持 Callable- 避免频繁创建销毁线程,资源可控,也便于统一管理生命周期
注意事项与常见误区
虽然写法极简,但底层机制没变,仍需注意并发基本规则:
- Lambda 创建的是
Runnable实例,不是Thread子类,所以不能直接调用run()—— 必须用start() - 不要在 Lambda 中直接捕获非 final 的循环变量(如 for 循环里的
i),容易引发意外共享;可用final int idx = i;临时转义 - 异常处理需在 Lambda 内部自行包裹
try-catch,因为Runnable.run()不抛受检异常 - 若需返回结果或传播异常,应改用
Callable + FutureTask,Lambda 同样适用:new FutureTask(() -> 42)


















