在 Java 中使用 lambda 表达式写多线程,本质不是“多线程必须用 lambda”,而是 Java 8 之后用 lambda 写线程更简洁、可读性更好、更容易配合函数式接口。下面从几个角度说清楚。
无论是哪种写法,线程本质还是:
ThreadRunnableCallableExecutorService例如最基础的:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
});
t.start();
Runnable 是函数式接口(核心原因)Runnable 只有一个抽象方法:
@FunctionalInterface
public interface Runnable {
void run();
}
✅ 只要接口只有一个抽象方法,就可以用 lambda
所以可以写成:
Thread t = new Thread(() -> {
System.out.println("hello");
});
t.start();
甚至更短:
new Thread(() -> System.out.println("hello")).start();
对比一下:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
}).start();
new Thread(() -> System.out.println("run")).start();
✅ 没有 new Runnable
✅ 没有 @Override
✅ 没有方法名噪音
实际开发中 很少直接 new Thread,而是用线程池:
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> {
System.out.println("task run");
});
如果是匿名类,会非常啰嗦。
多线程本质是:把“要做的事”传给线程
lambda 就是“把行为当参数传”:
Runnable task = () -> System.out.println("do something");
new Thread(task).start();
这点匿名内部类也可以,但 lambda 更自然。
⚠️ 注意:
Thread 或线程池错误理解示例:
() -> { ... } // 这不会启动线程
必须交给:
new Thread(...)Executor.execute(...)CompletableFuture() -> {
// 50 行代码
}
可读性差,应抽成方法或类。
lambda 只能实现一个方法。
Java 多线程用 lambda,不是因为线程需要 lambda,而是因为
Runnable/Callable是函数式接口,lambda 让“提交任务”这件事变得更简单、更清晰。
如果你愿意,我也可以对比:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。