私は問題があります。実行するたびにこのコードが同じ値を返さない場合があります。スレッドセーフではないし、parallel()でいくつかの並行性の問題が発生していると思われます。私はspliteratorを使用しようとしていますが、それは動作しますが、ランタイムは3倍悪いので、sequentalと同じです。どのように私はこれを行うことができますか?parallel()の並行性の問題
Ps: traverseDirectoryは、ディレクトリ内のすべての.txtファイルのBlockingQueueを返します。
try {
pq = traverseDirectory(dir, pq);
while(!pq.isEmpty()){
File f = pq.take();
LineNumberReader lr = new LineNumberReader(new FileReader(f));
lr.lines()
.parallel()
.forEach((line) -> {
String[] words = line.split("\\s+");
for(String word : words){
wordList.add(word);
}
}); // foreach
} // while
} //try
catch (IOException | InterruptedException e) {}
System.out.println("size: " + wordList.size());
EDIT は私がした単語が発見された行を追跡する必要がある、ということに言及するのを忘れ!
正しいですが、 '.flatMap(Pattern.compile(" \\ s + "):: splitAsStream)'を使用することをお勧めします。これは、正規表現パターンが各行ではなく1回だけ正確に解析され、各行の中間配列を満たさないことを保証します。 – Holger
@Holger 'splitAsStream'は私にとって新しいものです。あなたのおかげで幸せになれた。 –
@Holger flatMapとはどういう意味ですか? – yeahboy