Я пытаюсь удалить очень большую вложенную структуру каталогов, содержащую несколько файлов и подкаталог внутри. В каждом подкаталоге может быть несколько файлов и подкаталогов.
Таким образом, мы можем удалить только файл или пустой каталог здесь. Если каталог не пустой и содержит дополнительные файлы и подкаталоги, перечислите эти подкаталоги и файлы и удалите их в рекурсии.
Я написал здесь псевдокод и использовал параллельный поток для удаления списка в рекурсии.
class A {
boolean mainDeletemethod(obj){
boolean finalStatus = false;
if(obj.type == file){
deleteAPI(obj);
finalStatus = true;
} //if ends
else if(obj.type==directory){
if(obj.message.recursive == true) { //inner if
boolean status = deleteDirectoryAPI(obj)
if(!status)
return status
} //inner if ends
else{ // empty directory, delete it, deleteDir would take care of that, inner else loop
deleteDir(obj)
finalStatus = true;
} //inner else ends
}//else if ends
return finalStatus;
} //mainDeletemethod ends
boolean deleteDirectoryAPI(Object obj){
list<Object> results = listAPI(obj) //results would have subdirectories and files inside it
//trying to parallelize the deletion of files and directory
boolean stat =result
.stream()
.parallel()
.map(fileObject -> {
boolean individualStatus = null;
try {
individualStatus = deleteParallel(obj);
} catch (Exception e) {
_log.error("Error", e);
return individualStatus;
}
return true;
})
.filter(status-> status != true)
.findFirst()
.orElse(Status.OK);
if(stat!=true){
return stat;
}
} // deleteDirectoryAPI ends
boolean deleteParallel(obj) {
boolean status = mainDeletemethod(obj);
if(status)
return status;
return false;
} //deleteParallel ends
} //Class A ends
Есть некоторые проблемы, я застрял здесь в этом коде
.filter(status-> status != true)
.findFirst()
.orElse(Status.OK);
Этот код выше заставляет поток ждать, пока все подзадачи завершены. Он содержит поток в исполнителе по умолчанию. Когда все потоки в исполнителе будут исчерпаны в результате ожидания здесь в последовательности рекурсивного вызова, он застрянет?
Я полагаю, что это заставляет мою родительскую задачу ждать всех подзадач (в рекурсии, где в сценарии мы имеем глубокую структуру каталогов / файлов) и может вызвать тупиковую ситуацию, если мой пул потоков исчерпан. Может ли мой поток потоков здесь быть исчерпан?
- Я не хочу ждать на отдельных рекурсивных подзадачах, чтобы вернуть мне статус и проверить его, а хочу реализовать его через некоторую глобальную переменную Atomic, для которой задано значение false, если какая-либо из моих подзадач не выполнена, и вернуть ее. У меня может быть несколько задач удаления, поэтому здесь необходима переменная Map of Atomic, которая может отслеживать все запланированные задачи.