Java中用Lambda表达式创建线程,本质是利用Runnable函数式接口特性,以() -> { ... }替代冗长的匿名内部类,支持单行、多行、变量引用及方法引用写法,但需遵守有效final变量捕获规则,并注意线程安全。

Java 中用 Lambda 表达式创建线程,核心是把 Runnable 接口的匿名内部类替换成更简洁的 Lambda 写法。因为 Runnable 是函数式接口(只有一个抽象方法 run()),所以可以直接用 () -> { ... } 表示。
直接替换 Runnable 匿名类
传统写法需要新建匿名内部类,代码冗长:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程执行中");
}
}).start();
用 Lambda 只需一行:
new Thread(() -> System.out.println("线程执行中")).start();
如果逻辑多行,用大括号包裹:
立即学习“Java免费学习笔记(深入)”;
new Thread(() -> {
System.out.println("开始处理");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("处理完成");
}).start();
配合变量或方法引用更清晰
把任务逻辑提前定义好,再传给线程,可读性更强:
- 用局部变量保存 Lambda:
Runnable task = () -> {
System.out.println("后台任务:" + Thread.currentThread().getName());
};
new Thread(task).start();
- 用方法引用复用已有方法:
public static void doWork() {
System.out.println("执行静态方法");
}
new Thread(Example::doWork).start();
注意 Lambda 捕获变量的限制
Lambda 只能访问 有效 final 的局部变量(即声明后未被重新赋值):
String msg = "Hello"; new Thread(() -> System.out.println(msg)).start(); // ✅ 合法
String msg = "Hello"; msg = "World"; // ❌ 之后再赋值,Lambda 就不能用了 new Thread(() -> System.out.println(msg)).start();
实例字段或静态字段无此限制,可自由访问。
不推荐在 Lambda 中直接操作共享资源
简化写法不等于忽略线程安全。比如多个线程同时修改同一个 ArrayList,仍需同步:
List<String> list = new ArrayList<>();
// 错误:并发 add 可能抛 ConcurrentModificationException
new Thread(() -> list.add("A")).start();
new Thread(() -> list.add("B")).start();
// 正确:加锁或用线程安全集合
new Thread(() -> {
synchronized (list) {
list.add("A");
}
}).start();


















