2013-08-24 73 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 **回答。 –