2016-02-12 55 views
1

我搜索過類似的問題,但他們並沒有涉及for循環。 我有下面的代碼:如何傳遞的索引變量for循環匿名線程/ Runnable的

image = new BufferedImage[maxFiles]; 
    for (int i = 0; i < maxFiles; i++) { 
     new Thread(){ 
      public void run() {     
       try { 
        file = new File("0" + i + ".jpg"); 
        image[i] = ImageIO.read(file); 
       } catch (IOException e) {e.printStackTrace();} 
      } 
     }; 
    } 

正如你可以看到我想通過自己的線程加載每個圖像文件來優化一下。 不幸的是,可變的for循環無法通過運行方法過去了,我也不能使它最終還是靜態的。你會如何解決這個問題?

+0

出於好奇,有多少文件是'maxFiles'?一次創建無限數量的線程通常是一個壞主意。你有沒有考慮過使用_thread pool_呢? –

回答

5

你可以有相同的值最終的變數。

image = new BufferedImage[maxFiles]; 
for (int i = 0; i < maxFiles; i++) { 
    final int index = i; 
    new Thread(){ 
     public void run() {     
      try { 
       file = new File("0" + index + ".jpg"); 
       image[index] = ImageIO.read(file); 
      } catch (IOException e) {e.printStackTrace();} 
     } 
    }; 
} 

你可能也想開始你的線程。

+0

你令人驚訝的是對的;我想知道是否有更好的方法,而不是初始化** maxFiles ** int變量......這顯然只是語言的錯誤,是的,我忘了在這裏寫run()調用。 – mmalkavian

+0

@mmalkavian你想調用'start()',而不是'run()'。如果你打算給它調用'run()',那麼寫一個'Thread'就沒有意義。 – khelwood

0

除了@ khelwood的解決方案,您也可以使用實例變量在匿名類:

for (int i = 0; i < maxFiles; i++) { 
     new Thread() { 
      // Capture i here. 
      int index = i; 

      public void run() { 
       try { 
        file = new File("0" + index + ".jpg"); 
        image[index] = ImageIO.read(file); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
    } 
+0

這是行不通的,因爲匿名類中的代碼不允許引用非最終的'i'。 –

+0

@詹姆斯大。它可以訪問索引。 – OldCurmudgeon

+0

問題行是'int index = i;'那不會編譯。我試過了。 –