“lambda 表达(匿名内部类) 会在另一个线程中执行”
怎么理解这句话?看到网上资料很多都这么说,当然可能是互相抄的
lambda 表达式是独立线程执行?还是说有的场景下 lambda 是不在定义的线程调用执行?
怎么理解这句话?看到网上资料很多都这么说,当然可能是互相抄的
lambda 表达式是独立线程执行?还是说有的场景下 lambda 是不在定义的线程调用执行?
static void run(Runnable r) {
r.run();
}
}
这肯定是在同一个线程中执行的,这句话应该是有上下文的吧
如果是用 Lambda 实现启动 Runnable 线程,确实是会在另一个线程中执行,但是总不能说是”lambda 表达(匿名内部类) 会在另一个线程中执行”吧?
“你不能在匿名内部类中修改外部局部变量,因为 Java 对于匿名内部类传递变量的实现是基于构造器传参的,也就是说如果允许你在匿名内部类中修改值,你修改的是匿名内部类中的外部局部变量副本,最终并不会对外部类产生效果,因为已经是二个变量了。
这样就会让程序员产生困扰,原以为修改会生效,事实上却并不会,所以 Java 就禁止在匿名内部类中修改外部局部变量。”
我找到你说的那篇文章了,下面评论区早就吐槽过了
不过这个也体现了一个语言设计问题, 闭包捕获变量有时候是危险的. 比如 Akka 这个库因为在 JVM 上, 所以只能靠自觉不要捕获 mutable 的东西, 不然就会把线程池卡死.
比较好的设计是 Erlang 那种, spawn 进程的时候 lambda 捕获的东西全是 immutable 的, 这样数据可以任意复制, 放在哪个进程都是一样的, 这样就可以任意捕获而不会有任何副作用.