2014-11-06 88 views
1

我有一个匿名类,它从集合中获取迭代值,如下所示。通过这段代码,是否在匿名类中保留了直接变量in?或不同的线程可以采取相同的in值?匿名类中的最终变量

List<Integer> list = new ArrayList<>(); 
for (int i = 1; i <= 20; i++) 
    list.add(i); 

for (final Integer in : list) { 
    new Thread(new Runnable() { 

     @Override 
     public void run() { 
      Thread.sleep(1000); 
      System.out.println(value + "," + in); 
     } 
    }).start(); 
} 
+1

我不明白你在问什么。在这种情况下,你为每个20个线程传递一个不同的'in'值。那是你想知道的吗? – 2014-11-06 23:02:01

+0

我的问题是两个线程可以共享相同的值吗? – vinayag 2014-11-06 23:04:48

+1

另外我认为迭代集合上的迭代隐式转换为循环的正常循环,其中包含相同的变量。所以我很困惑,每次迭代集合时是否都会创建一个新的'in'变量。 – vinayag 2014-11-06 23:06:52

回答

3

是的,in每个值在每个创建的Thread S的被保留。只要它声明为final,或者如果您使用的是Java 8,如果它是“有效的最终”(不是final但未更改),则可以在匿名内部类中使用局部变量。

0

你不能有一个变量作为final,并给它一个新的值。最后意味着:价值是不可改变的,也是最终的。

而且因为它是最后的,Java可以安全地将其复制到本地匿名类