跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • “lambda 表达(匿名内部类) 会在另一个线程中执行”
未分類
16 1 月 2021

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

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

資深大佬 : noble4cc 0

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

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

大佬有話說 (23)

  • 資深大佬 : XDJI

    说的是并行流? lambda 只是一种写法

  • 資深大佬 : zhzy0077

    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

    parallel 的 stream ?
    ExecutorService.submit ?

  • 主 資深大佬 : noble4cc

    @XDJI 不是并行流,
    @zhzy0077
    可以 Google 下 Variable used in lambda expression should be final or effectively final

  • 資深大佬 : misaka19000

    看一下汇编就知道了

  • 資深大佬 : chendy

    @noble4cc 所以标题这句话的上下文和原文是啥呢?
    至少不应该是“会”在另一个线程中执行,应该是“可以”在另一个线程中执行吧

  • 資深大佬 : wucao219101

    毫无逻辑的一句话,Lambda 表达式跟线程没有一点关系,lambda 表达式只是一种语法。

    如果是用 Lambda 实现启动 Runnable 线程,确实是会在另一个线程中执行,但是总不能说是”lambda 表达(匿名内部类) 会在另一个线程中执行”吧?

  • 資深大佬 : zoharSoul

    没有这种说法

  • 資深大佬 : pursuer

    lambda”可能”会在另一个线程中执行,就像回调函数一样

  • 主 資深大佬 : noble4cc

    @wucao219101 其实我也这么觉得

  • 資深大佬 : lululau

    你的问题其实和线程没关系,和 lambda 也没关系:

    “你不能在匿名内部类中修改外部局部变量,因为 Java 对于匿名内部类传递变量的实现是基于构造器传参的,也就是说如果允许你在匿名内部类中修改值,你修改的是匿名内部类中的外部局部变量副本,最终并不会对外部类产生效果,因为已经是二个变量了。
    这样就会让程序员产生困扰,原以为修改会生效,事实上却并不会,所以 Java 就禁止在匿名内部类中修改外部局部变量。”

  • 資深大佬 : HolmLoh

    lambda 会在别的线程中运行
    但不是一定会再憋的线程中运行
    举个例子
    “`
    Runnable runnable = () -> {};
    runnable.run();
    “`
    “`
    Runnable runnable = () -> {};
    new Thread(runnable).start();
    “`

  • 資深大佬 : jptx

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

    我找到你说的那篇文章了,下面评论区早就吐槽过了

  • 資深大佬 : freebird1994

    可能会在另外的线程执行吧,parallel 。用 lambda 最烦的就是这点

  • 資深大佬 : young1lin

    @chendy 我觉得也可能说的是这个,看看《 Java 8 实战》就知道了。不过这是 Stream 相关的,不是 Lambda

  • 資深大佬 : trevis761923

    并行流会另外开线程.

  • 主 資深大佬 : noble4cc

    @lululau 这个确实知道,但是网上的文章都是说会在多个线程执行,而且一搜一大片都是这么说的。。。所以感觉有些奇怪

  • 資深大佬 : vinceall

    自己做实验就知道了,应该不会

  • 資深大佬 : vinceall

    @noble4cc 网上的东西。。。连错别字都一样,没营养

  • 主 資深大佬 : noble4cc

    @vinceall 确实做过实验了,和线程没什么关系。。。

  • 資深大佬 : fpure

    这说法明显是断章取义然后越传越偏的典型

  • 資深大佬 : namelosw

    只是某些 lambda 会新建线程, 绝大部分是不会的. 不在新线程运行的 lambda 改变量跟 JS 闭包一样, 就是稀松平常的东西, 没有什么问题.

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

    比较好的设计是 Erlang 那种, spawn 进程的时候 lambda 捕获的东西全是 immutable 的, 这样数据可以任意复制, 放在哪个进程都是一样的, 这样就可以任意捕获而不会有任何副作用.

  • 資深大佬 : faceRollingKB

    lambda 不就是一种定义匿名方法的语法么,怎么就跟线程扯上关系了?

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具