Многопоточность внутри рекурсивного вложенного каталога при его удалении - PullRequest
0 голосов
/ 30 августа 2018
  1. Я пытаюсь удалить очень большую вложенную структуру каталогов, содержащую несколько файлов и подкаталог внутри. В каждом подкаталоге может быть несколько файлов и подкаталогов.

  2. Таким образом, мы можем удалить только файл или пустой каталог здесь. Если каталог не пустой и содержит дополнительные файлы и подкаталоги, перечислите эти подкаталоги и файлы и удалите их в рекурсии.

  3. Я написал здесь псевдокод и использовал параллельный поток для удаления списка в рекурсии.

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);
  1. Этот код выше заставляет поток ждать, пока все подзадачи завершены. Он содержит поток в исполнителе по умолчанию. Когда все потоки в исполнителе будут исчерпаны в результате ожидания здесь в последовательности рекурсивного вызова, он застрянет?

  2. Я полагаю, что это заставляет мою родительскую задачу ждать всех подзадач (в рекурсии, где в сценарии мы имеем глубокую структуру каталогов / файлов) и может вызвать тупиковую ситуацию, если мой пул потоков исчерпан. Может ли мой поток потоков здесь быть исчерпан?

  3. Я не хочу ждать на отдельных рекурсивных подзадачах, чтобы вернуть мне статус и проверить его, а хочу реализовать его через некоторую глобальную переменную Atomic, для которой задано значение false, если какая-либо из моих подзадач не выполнена, и вернуть ее. У меня может быть несколько задач удаления, поэтому здесь необходима переменная Map of Atomic, которая может отслеживать все запланированные задачи.
...