2012-03-09 12 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

あなたはまだ同期を使用していますか? –

答えて

8

フィールドは必要ありません。再帰呼び出しの結果をcountFilesに追加するだけです。

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

つまり、ディレクトリ内のファイルの深い数は、ディレクトリ内のファイルとディレクトリ内の各ディレクトリの深い数の合計です。 –

+1

はい、再帰の結果を戻す必要があります、それは問題を解決します。 – simaremare

+0

Markありがとうございました! – Snoke

3

countFilesがここではクラスレベル変数である必要がある明確な理由はありません。 countFilesをローカル変数にすることで、コードをスレッドセーフにすることができます。この変数は、メソッドによって返されます。

関連する問題