2012-03-09 23 views
3

我做了一个递归的文件检查,问题是我不能有方法本身内的计数器,所以我宣布它在外面。但问题是,这是线程安全的。如何使递归调用(getTotalFiles)线程安全?

private int countFiles = 0; 
private int getTotalFiles(String path) { 

    File file = new File(path); 
    File listFile[] = file.listFiles(); 

    for (File f : listFile) { 
     if (f.isFile()) { 
      countFiles++; 
     } 
     if (f.isDirectory()) { 
      getTotalFiles(f.getAbsolutePath()); 
     } 
    } 

    return countFiles; 
} 

类变量countFiles不是线程安全的。如何使这个线程安全?

+1

哼,你用过还是查了同步呢? – 2012-03-09 03:17:07

回答

8

您不需要字段,只需将递归调用的结果添加到countFiles即可。

private int getTotalFiles(String path) { 
    //... 
    if (f.isFile()) { 
     countFiles++; 
    } 
    if (f.isDirectory()) { 
     countFiles += getTotalFiles(path); 
    } 
} 
+0

换句话说,目录中文件的深度数是目录中文件的总和加上目录中每个目录的深度数。 – 2012-03-09 03:20:46

+1

是的,你需要返回递归结果,它解决了这个问题。 – simaremare 2012-03-09 03:21:38

+0

非常感谢Mark! – Snoke 2012-03-09 03:39:22

3

我看不到任何明确的理由,为什么countFiles应该是一个类级变量在这里。通过使countFiles成为一个局部变量,无论如何由该方法返回,都可以使代码成为线程安全的。