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 来写,其记录时的行为一样么?
谢谢
1
javapythongo 2019-11-21 11:32:23 +08:00 1
闭包作用域
|
2
wsxyeah 2019-11-21 12:22:31 +08:00 via iPhone
在你 new Runnable 的时候就把 zhw ge zhi
|
4
CYKun 2019-11-21 13:57:55 +08:00 via Android 1
闭包,index 的值被复制了一份传递给了 Thread。
注意因为是通过复制传递的,所以 java 要求这个 index 是 final 或者“事实上”final 的,你可以试试在 create 里面写一点修改 index 的代码,编译器会报错的。 至于你说的这个 index 在 Thread 内部是怎样存在的,(似乎)是属于 jvm 的范畴,(应用程序员)不用太在意 |