V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
noble4cc
V2EX  ›  Java

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

  •  
  •   noble4cc · 2021-01-14 10:18:23 +08:00 · 3843 次点击
    这是一个创建于 1441 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2021-01-14 11:12:08 +08:00
    其实感觉作者是想表达”Lambda 表达式可能会在不同的线程执行“
    24 条回复    2021-01-28 15:37:41 +08:00
    XDJI
        1
    XDJI  
       2021-01-14 10:24:03 +08:00
    说的是并行流? lambda 只是一种写法
    zhzy0077
        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();
    }
    }

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

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

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


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

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

    比较好的设计是 Erlang 那种, spawn 进程的时候 lambda 捕获的东西全是 immutable 的, 这样数据可以任意复制, 放在哪个进程都是一样的, 这样就可以任意捕获而不会有任何副作用.
    faceRollingKB
        23
    faceRollingKB  
       2021-01-14 17:32:15 +08:00
    lambda 不就是一种定义匿名方法的语法么,怎么就跟线程扯上关系了?
    mitsuizzz
        24
    mitsuizzz  
       2021-01-28 15:37:41 +08:00
    @lululau 很清晰 学到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 02:03 · PVG 10:03 · LAX 18:03 · JFK 21:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.