У меня случается, что трудно реплицировать ошибку, где висит одна из моих нитей.Java nio: многопоточность с DirectoryStream
- Веб-паук прячет html-файлы в каталог.
- Поток для обработки файлов считывает файлы в каталоге, обрабатывает их по одному и перемещает их.
Поскольку файл перемещения файлового процессора (по логической необходимости) может возникать только тогда, когда файл уже находится в каталоге, процесс чтения файла файлового процессора является асинхронным и вряд ли приведет к зависанию.
HOWEVER, поток файлового процессора также сканирует каталог, и это может произойти, поскольку поток веб-паука сохраняет файл в каталоге.
ВОПРОС: Если файл сохранен в этом каталоге при вызове следующего метода чтения, вызывает ли это зависание? (Честно говоря, я не понимаю, как это возможно, но, возможно, именно поэтому у меня есть ошибка).
Если да, то как решить проблему?
private void listFiles(Path path)
{
Log.getLogger().debug("started ......");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path))
{
for (Path entry : stream)
{
if (Files.isDirectory(entry))
{
listFiles(entry);
}
else
{
files.add(entry);
}
}
}
catch (Exception e)
{
Log.getLogger().error(e.getMessage(), e);
}
Log.getLogger().debug("done");
}
Использование * один * 'ReentrantLock'. Вызов 'lock()' при записи ваших файлов 'unlock()' когда вы закончите. Затем на другой Thread вызовите 'lock()' перед выполнением сканирования/копирования и 'unlock()' когда это будет сделано. Это должно дать вам представление о том, связано ли это с потоками, мешающими друг другу в работе или нет. Это предотвратит выполнение потоками работы, когда другой поток приобрел блокировку в это время. – Selim
Я попробую. Вы хотите опубликовать это как ответ? Даже если это не решит мою проблему, это хороший совет и необходимый диагностический шаг. – Jake