怎么理解这句话?看到网上资料很多都这么说,当然可能是互相抄的
lambda 表达式是独立线程执行?还是说有的场景下 lambda 是不在定义的线程调用执行?
1
XDJI 2021-01-14 10:24:03 +08:00
说的是并行流? lambda 只是一种写法
|
2
zhzy0077 2021-01-14 10:25:44 +08:00 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(); } } 这肯定是在同一个线程中执行的,这句话应该是有上下文的吧 |
3
chendy 2021-01-14 10:27:12 +08:00
parallel 的 stream ?
ExecutorService.submit ? |
4
noble4cc OP |
5
misaka19000 2021-01-14 10:40:37 +08:00
看一下汇编就知道了
|
6
chendy 2021-01-14 10:59:54 +08:00
@noble4cc 所以标题这句话的上下文和原文是啥呢?
至少不应该是“会”在另一个线程中执行,应该是“可以”在另一个线程中执行吧 |
7
wucao219101 2021-01-14 11:01:55 +08:00
毫无逻辑的一句话,Lambda 表达式跟线程没有一点关系,lambda 表达式只是一种语法。
如果是用 Lambda 实现启动 Runnable 线程,确实是会在另一个线程中执行,但是总不能说是"lambda 表达(匿名内部类) 会在另一个线程中执行"吧? |
8
zoharSoul 2021-01-14 11:02:29 +08:00
没有这种说法
|
9
pursuer 2021-01-14 11:05:51 +08:00
lambda"可能"会在另一个线程中执行,就像回调函数一样
|
10
noble4cc OP @wucao219101 其实我也这么觉得🤦♀️,作者可能想表达 Lambda 可能在不同的线程中执行
|
11
lululau 2021-01-14 11:32:29 +08:00
你的问题其实和线程没关系,和 lambda 也没关系:
“你不能在匿名内部类中修改外部局部变量,因为 Java 对于匿名内部类传递变量的实现是基于构造器传参的,也就是说如果允许你在匿名内部类中修改值,你修改的是匿名内部类中的外部局部变量副本,最终并不会对外部类产生效果,因为已经是二个变量了。 这样就会让程序员产生困扰,原以为修改会生效,事实上却并不会,所以 Java 就禁止在匿名内部类中修改外部局部变量。” |
12
HolmLoh 2021-01-14 11:48:02 +08:00
lambda 会在别的线程中运行
但不是一定会再憋的线程中运行 举个例子 ``` Runnable runnable = () -> {}; runnable.run(); ``` ``` Runnable runnable = () -> {}; new Thread(runnable).start(); ``` |
13
jptx 2021-01-14 13:20:37 +08:00
|
14
freebird1994 2021-01-14 13:46:53 +08:00 via Android
可能会在另外的线程执行吧,parallel 。用 lambda 最烦的就是这点
|
15
young1lin 2021-01-14 13:54:26 +08:00
@chendy 我觉得也可能说的是这个,看看《 Java 8 实战》就知道了。不过这是 Stream 相关的,不是 Lambda
|
16
trevis761923 2021-01-14 14:07:14 +08:00
并行流会另外开线程.
|
17
noble4cc OP @lululau 这个确实知道,但是网上的文章都是说会在多个线程执行,而且一搜一大片都是这么说的。。。所以感觉有些奇怪
|
18
vinceall 2021-01-14 15:37:39 +08:00
自己做实验就知道了,应该不会
|
21
fpure 2021-01-14 16:43:27 +08:00
这说法明显是断章取义然后越传越偏的典型
|
22
namelosw 2021-01-14 17:11:28 +08:00
只是某些 lambda 会新建线程, 绝大部分是不会的. 不在新线程运行的 lambda 改变量跟 JS 闭包一样, 就是稀松平常的东西, 没有什么问题.
不过这个也体现了一个语言设计问题, 闭包捕获变量有时候是危险的. 比如 Akka 这个库因为在 JVM 上, 所以只能靠自觉不要捕获 mutable 的东西, 不然就会把线程池卡死. 比较好的设计是 Erlang 那种, spawn 进程的时候 lambda 捕获的东西全是 immutable 的, 这样数据可以任意复制, 放在哪个进程都是一样的, 这样就可以任意捕获而不会有任何副作用. |
23
faceRollingKB 2021-01-14 17:32:15 +08:00
lambda 不就是一种定义匿名方法的语法么,怎么就跟线程扯上关系了?
|