リストに新しいファイルを追加する単一のFileScannerスレッドと、新しいファイルを取得してそれぞれが独自のファイルを解析する複数のFileParserスレッドがあります。同期のために、リストへの追加とリストからの読み取りを同期リソースブロックに配置しました。問題は、FileScannerスレッドが不足しているように見え、他のFileParserスレッドがリソース(リスト)を解放するのを待っている同期ブロックに入らない場合があることです。私の質問は、FileScannerに最大の優先度を設定し、他のFileParserスレッドに最小の優先度を設定した場合、問題は解決するでしょうか?言い換えると、JVMがスレッドから同期ブロックへのアクセスを許可するために選択するために、スレッドの優先順位は影響を及ぼしますか?ありがとう。
アップデート:
private List<ScannerFile> scannedFiles = Collections.synchronizedList(new LinkedList<ScannerFile>()) ;
これは私のFileScannerスレッドで呼び出されます:
synchronized(scannedFiles){
for(ScannerFile f: newList)
try{
scannedFiles.add(f);
}
catch(ConcurrentModificationException e){
logger.error(e);
}
}
そして、これは私のFileParserスレッドで呼び出されます。
synchronized(scannedFiles){
try{
for(ScannerFile f: scannedFiles){
if(parserName.equals(f.getParserName()) && f.isNew() == true){
listNewFiles.add(f);
}
}
return listNewFiles;
}
catch(ConcurrentModificationException e){
logger.trace(e);
return new ArrayList<ScannerFile>();
}
}