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

2019-11-21 11:23:54 +08:00
 Newyorkcity

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 来写,其记录时的行为一样么?

谢谢

1130 次点击
所在节点    问与答
4 条回复
javapythongo
2019-11-21 11:32:23 +08:00
闭包作用域
wsxyeah
2019-11-21 12:22:31 +08:00
在你 new Runnable 的时候就把 zhw ge zhi
wsxyeah
2019-11-21 12:23:14 +08:00
@wsxyeah 在你 new Runnable 的时候就把这个值拷贝了一份
CYKun
2019-11-21 13:57:55 +08:00
闭包,index 的值被复制了一份传递给了 Thread。

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

至于你说的这个 index 在 Thread 内部是怎样存在的,(似乎)是属于 jvm 的范畴,(应用程序员)不用太在意

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/621672

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX