V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

Java :请问这段代码里,index 的值为何能被记录?

  •  
  •   Newyorkcity · 2019-11-21 11:23:54 +08:00 · 1227 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    class Hello {
        public Thread create(int index){
            return new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                            if(index == 1){
                                System.out.println("index=1");
                            }else{
                                System.out.println("hello");
                            }
                        }
                    }
            );
        }
    
        public static void main(String[] args) {
            Hello hello = new Hello();
            Thread thread = hello.create(1);
            thread.run();
        }
    }
    

    结果上是可以运行的。

    但我不太理解,Thread thread = hello.create(1);这一步得到的thread,内部难道是这样:

    {
        int index = 1;
        ...
    }
    

    的? 还是

    {
        Runnable target = { int index = 1; ....}
        ....
    }
    

    这样的?


    就是从理论上来说作为create(int)的参数传入的index和它的值,应该在函数调用结束后便销毁,但实际上new出来的thread记录了这个值,它是怎么记录的?有相关的官方文档来说明这一情况下的规则么?

    另外,如果这里使用 java8 的 lambda 来写,其记录时的行为一样么?

    谢谢

    4 条回复    2019-11-21 13:57:55 +08:00
    javapythongo
        1
    javapythongo  
       2019-11-21 11:32:23 +08:00   ❤️ 1
    闭包作用域
    wsxyeah
        2
    wsxyeah  
       2019-11-21 12:22:31 +08:00 via iPhone
    在你 new Runnable 的时候就把 zhw ge zhi
    wsxyeah
        3
    wsxyeah  
       2019-11-21 12:23:14 +08:00 via iPhone
    @wsxyeah 在你 new Runnable 的时候就把这个值拷贝了一份
    CYKun
        4
    CYKun  
       2019-11-21 13:57:55 +08:00 via Android   ❤️ 1
    闭包,index 的值被复制了一份传递给了 Thread。

    注意因为是通过复制传递的,所以 java 要求这个 index 是 final 或者“事实上”final 的,你可以试试在 create 里面写一点修改 index 的代码,编译器会报错的。

    至于你说的这个 index 在 Thread 内部是怎样存在的,(似乎)是属于 jvm 的范畴,(应用程序员)不用太在意
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   984 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:18 · PVG 05:18 · LAX 13:18 · JFK 16:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.