2013-08-24 71 views
3

我想從一個目錄中讀取多個文件,併爲每個文件創建一個單獨的線程。在迭代循環時,匿名內部類不能使用非最終變量。多線程內循環

我的問題是如何建立一個循環內的多個線程。(我需要手動爲每個文件創建,不能使用執行服務或別的什麼的線程)

class de 
{ 

    void commit(File x){ 

     int sum =0; 
     try{ 
      FileInputStream fin = new FileInputStream(x); 
      byte[]b= new byte[5000]; 
      fin.read(b); 
      for (byte digit:b){ 
       sum=digit+sum; 
      } 
      System.out.println(sum); 
     } 
     catch(Exception e){} 
    } 
    public static void main (String args[]){  
     File f = new File("C:\\Users\\Sanjana\\workspace\\IO\\Numbers"); 
     File []store = f.listFiles(new FilenameFilter(){ 
      public boolean accept(File f, String name){ 
       return name.endsWith("txt"); 
      } 
     }); 

     for (File x: store){ 
      Thread t = new Thread(){ 
       public void run(){ 
       //new de().commit(x); /**/Error here non final variable x** 
       } 
      }; 
     } 
    }  
} 
+0

感謝您編輯您的發佈代碼! –

+1

您確定從多個線程讀取這些文件會提高應用程序性能嗎?請記住,您的硬盤無法在不同的位置使用其讀取頭。 – oddparity

回答

4

變化

for (File x: store) 

for (final File x: store) 

編輯你狀態:

它的工作,但最終的變量是不變的,這裏x被更改爲store.howz的每個元素的工作

x是for-each循環的參數並且可以根據for-each循環的定義來聲明爲final。每次循環循環時,就好像x被重新創建一樣。


JLS 14.14.2節上增強的for循環:

for語句增強相當於一個基本的申請表格的聲明:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    VariableModifiersopt TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 

所以這告訴我最後會適合像這樣:

for (I #i = Expression.iterator(); #i.hasNext();) { 
    final VariableModifiersopt TargetType Identifier = 
     (TargetType) #i.next(); 
    Statement 
} 

所以x實際上是上面的標識符,實際上在循環的每次迭代中都重新聲明。

在你的代碼,我在想,這是等同於:

for (Iterator<File> iterator = Arrays.asList(scores).iterator(); iterator.hasNext();) { 
    final File file = iterator.next(); 
    new Thread(new Runnable() { 
     public void run() { 
      new de().commit(file); 
     } 
    }).start(); 
    } 

編輯2
注意,你的線程的使用可以改善,那你應該習慣得到使用Runnable:

for (final File x: store){ 
     new Thread(new Runnable() { 

     @Override 
     public void run() { 
      new de().commit(x); // "de" should be "De" since it is a class 
     } 
     }).start(); 
    } 
+0

它的工作但最終的變量是不變的,這裏x正在改變store.howz的每個元素工作 – Sanjana

+0

@Sanjana:請參閱**編輯2 **回答。 –