Lambda仅简化Runnable实现,必须调用start()(或submit/execute)才能并发执行;直接调用run()仍是同步执行,无新线程。

关键不是“确保调用 start()”,而是必须显式调用 start()——Lambda 表达式本身只负责提供 run() 的实现逻辑,它不参与线程启动过程。
Lambda 只替代 Runnable,不替代 Thread 启动逻辑
Lambda 表达式在多线程中本质是 简化 Runnable 接口的实现,例如:
-
✅ 正确写法(Lambda + start):
new Thread(() -> System.out.println("任务执行")).start(); -
❌ 错误写法(Lambda + run):
new Thread(() -> System.out.println("任务执行")).run();(仍在主线程执行,无并发)
这里 Lambda 替代的是 new Runnable() { public void run() { ... } } 这一整块,但 Thread 对象仍需靠 .start() 触发底层线程创建和调度。
常见误操作与识别方式
以下情况说明你没调用 start():
- 输出顺序严格串行(如主线程打印完才出现子线程内容)
- 调用栈里看不到新线程名(如 “Thread-0”),只有 “main” 线程
- 使用
Thread.currentThread().getName()在 Lambda 体内打印,结果仍是 “main”
重构时的安全习惯
把 Lambda 当作“任务描述”,把 Thread 实例当作“执行者”,二者职责分明:
- 定义任务:用 Lambda 写清楚 要做什么(即 run 里的逻辑)
- 启动执行:必须通过
new Thread(...).start()或threadRef.start() - 避免直接调用
run(),哪怕它是 Lambda 形式——它只是个普通方法
进阶提醒:别混淆线程池场景
用 ExecutorService 时,Lambda 同样只传给 submit() 或 execute():
-
executor.execute(() -> System.out.println("池中执行"));✅ 自动在线程池线程中运行 -
Runnable r = () -> ...; r.run();❌ 仍在当前线程同步执行
此时“启动”由线程池内部完成,但 Lambda 依然不负责触发调度——它只交付任务体。

















