noble4cc
V2EX  ›  Java

"lambda 表达(匿名内部类) 会在另一个线程中执行"

By noble4cc at 2021 年 1 月 14 日 · 5283 次点击

怎么理解这句话?看到网上资料很多都这么说,当然可能是互相抄的

lambda 表达式是独立线程执行?还是说有的场景下 lambda 是不在定义的线程调用执行?

第 1 条附言  ·  2021 年 1 月 14 日
其实感觉作者是想表达”Lambda 表达式可能会在不同的线程执行“
24 条回复  •  2021-01-28 15:37:41 +08:00
XDJI
   1
XDJI  
   2021 年 1 月 14 日
说的是并行流? lambda 只是一种写法
zhzy0077
   2
zhzy0077  
   2021 年 1 月 14 日   ❤️ 1
import java.lang.*;
public class Main {
public static void main(String[] args) {
run(() -> System.out.println("hello world"));
}

static void run(Runnable r) {
r.run();
}
}

这肯定是在同一个线程中执行的,这句话应该是有上下文的吧
chendy
   3
chendy  
   2021 年 1 月 14 日
parallel 的 stream ?
ExecutorService.submit ?
noble4cc
   4
noble4cc  
OP
   2021 年 1 月 14 日
@XDJI 不是并行流,
@zhzy0077
可以 Google 下 Variable used in lambda expression should be final or effectively final
misaka19000
   5
misaka19000  
   2021 年 1 月 14 日
看一下汇编就知道了
chendy
   6
chendy  
   2021 年 1 月 14 日
@noble4cc 所以标题这句话的上下文和原文是啥呢?
至少不应该是“会”在另一个线程中执行,应该是“可以”在另一个线程中执行吧
wucao219101
   7
wucao219101  
   2021 年 1 月 14 日
毫无逻辑的一句话,Lambda 表达式跟线程没有一点关系,lambda 表达式只是一种语法。

如果是用 Lambda 实现启动 Runnable 线程,确实是会在另一个线程中执行,但是总不能说是"lambda 表达(匿名内部类) 会在另一个线程中执行"吧?
zoharSoul
   8
zoharSoul  
   2021 年 1 月 14 日
没有这种说法
pursuer
   9
pursuer  
   2021 年 1 月 14 日
lambda"可能"会在另一个线程中执行,就像回调函数一样
noble4cc
   10
noble4cc  
OP
   2021 年 1 月 14 日
@wucao219101 其实我也这么觉得🤦‍♀️,作者可能想表达 Lambda 可能在不同的线程中执行
lululau
   11
lululau  
   2021 年 1 月 14 日
你的问题其实和线程没关系,和 lambda 也没关系:

“你不能在匿名内部类中修改外部局部变量,因为 Java 对于匿名内部类传递变量的实现是基于构造器传参的,也就是说如果允许你在匿名内部类中修改值,你修改的是匿名内部类中的外部局部变量副本,最终并不会对外部类产生效果,因为已经是二个变量了。
这样就会让程序员产生困扰,原以为修改会生效,事实上却并不会,所以 Java 就禁止在匿名内部类中修改外部局部变量。”
HolmLoh
   12
HolmLoh  
   2021 年 1 月 14 日
lambda 会在别的线程中运行
但不是一定会再憋的线程中运行
举个例子
```
Runnable runnable = () -> {};
runnable.run();
```
```
Runnable runnable = () -> {};
new Thread(runnable).start();
```
jptx
   13
jptx  
   2021 年 1 月 14 日


我找到你说的那篇文章了,下面评论区早就吐槽过了
freebird1994
   14
freebird1994  
   2021 年 1 月 14 日 via Android
可能会在另外的线程执行吧,parallel 。用 lambda 最烦的就是这点
young1lin
   15
young1lin  
   2021 年 1 月 14 日
@chendy 我觉得也可能说的是这个,看看《 Java 8 实战》就知道了。不过这是 Stream 相关的,不是 Lambda
trevis761923
   16
trevis761923  
   2021 年 1 月 14 日
并行流会另外开线程.
noble4cc
   17
noble4cc  
OP
   2021 年 1 月 14 日
@lululau 这个确实知道,但是网上的文章都是说会在多个线程执行,而且一搜一大片都是这么说的。。。所以感觉有些奇怪
vinceall
   18
vinceall  
   2021 年 1 月 14 日
自己做实验就知道了,应该不会
vinceall
   19
vinceall  
   2021 年 1 月 14 日
@noble4cc 网上的东西。。。连错别字都一样,没营养
noble4cc
   20
noble4cc  
OP
   2021 年 1 月 14 日
@vinceall 确实做过实验了,和线程没什么关系。。。
fpure
   21
fpure  
   2021 年 1 月 14 日
这说法明显是断章取义然后越传越偏的典型
namelosw
   22
namelosw  
   2021 年 1 月 14 日
只是某些 lambda 会新建线程, 绝大部分是不会的. 不在新线程运行的 lambda 改变量跟 JS 闭包一样, 就是稀松平常的东西, 没有什么问题.

不过这个也体现了一个语言设计问题, 闭包捕获变量有时候是危险的. 比如 Akka 这个库因为在 JVM 上, 所以只能靠自觉不要捕获 mutable 的东西, 不然就会把线程池卡死.

比较好的设计是 Erlang 那种, spawn 进程的时候 lambda 捕获的东西全是 immutable 的, 这样数据可以任意复制, 放在哪个进程都是一样的, 这样就可以任意捕获而不会有任何副作用.
faceRollingKB
   23
faceRollingKB  
   2021 年 1 月 14 日
lambda 不就是一种定义匿名方法的语法么,怎么就跟线程扯上关系了?
mitsuizzz
   24
mitsuizzz  
   2021 年 1 月 28 日
@lululau 很清晰 学到了
© 2026 V2EX · 1260ms · 3.9.8.5