Java 8起可用Lambda表达式简化Runnable任务:一行代码new Thread(() -> System.out.println("Hello")).start()即可创建并启动线程;需注意变量捕获要求、异常处理必须try-catch、耗时操作应交由ExecutorService管理,返回值需求则改用Callable+Lambda。

Java 8 起,Lambda 表达式让 Runnable 任务的定义和启动变得极简——核心就是用 () -> { ... } 替代冗长的匿名内部类,一行代码即可完成线程任务创建与启动。
直接用 Lambda 启动线程
Runnable 是函数式接口,只有一个 run() 方法,无参数、无返回值,天然适配 () -> {...} 形式:
- 传统写法(三行):
new Thread(new Runnable() { public void run() { System.out.println("Hello"); } }).start(); - Lambda 写法(一行):
new Thread(() -> System.out.println("Hello")).start();
注意必须调用 start(),不是 run();后者只是普通方法调用,不会新建线程。
捕获外部变量传递状态
Lambda 支持访问所在作用域的局部变量,但该变量必须是 final 或“事实 final”(声明后未再赋值):
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
String msg = "Done"; new Thread(() -> System.out.println(msg)).start(); - ❌ 错误:
String msg = "Done"; msg = "Changed"; new Thread(() -> System.out.println(msg)).start();(编译失败) - 需修改状态?用
AtomicInteger、AtomicReference或包装对象,例如:AtomicInteger count = new AtomicInteger(0); new Thread(() -> count.incrementAndGet()).start();
处理异常和阻塞操作
Runnable 的 run() 方法不能声明 throws,所以 受检异常(如 InterruptedException)必须在 Lambda 内 try-catch:
- 错误写法:
() -> Thread.sleep(100)(编译不通过) - 正确写法:
() -> { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } - 耗时或 I/O 操作别直接用 new Thread + Lambda 启动——应交给
ExecutorService管理,避免线程爆炸和资源失控
需要返回值?换用 Callable + Lambda
Runnable 无返回值。若要异步获取结果,改用 Callable<t></t> 接口,配合 ExecutorService.submit():
ExecutorService exec = Executors.newSingleThreadExecutor();Future<string> future = exec.submit(() -> { Thread.sleep(500); return "Success"; });</string>String result = future.get(); // 阻塞等待结果
这种写法仍用 Lambda,语法简洁,且支持泛型返回与超时控制。


















