2014-11-06 129 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可以安全地將其複製到本地匿名類