Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除递归嵌套目录时在其内部执行多线程_Java_Multithreading_Recursion_Parallel Processing_Java 8 - Fatal编程技术网

Java 删除递归嵌套目录时在其内部执行多线程

Java 删除递归嵌套目录时在其内部执行多线程,java,multithreading,recursion,parallel-processing,java-8,Java,Multithreading,Recursion,Parallel Processing,Java 8,我试图删除一个非常大的嵌套目录结构,其中包含多个文件和子目录。每个子目录中可以有多个文件和子目录 所以我们只能在这里删除一个文件或一个空目录。如果一个目录不是空的,并且有更多的文件和子目录,请列出这些子目录和文件,并在递归中删除它们 我在这里编写了一个伪代码,并使用并行流在递归中删除列表 上面的代码使流等待所有子任务完成。它将线程保存在默认执行器中。当执行器中的所有线程都因按递归调用的顺序在这里等待而耗尽时,它会被卡住吗 我想这会使我的父任务等待所有子任务(在递归中,在一个场景中,我们有深度目录

我试图删除一个非常大的嵌套目录结构,其中包含多个文件和子目录。每个子目录中可以有多个文件和子目录

  • 所以我们只能在这里删除一个文件或一个空目录。如果一个目录不是空的,并且有更多的文件和子目录,请列出这些子目录和文件,并在递归中删除它们

  • 我在这里编写了一个伪代码,并使用并行流在递归中删除列表

  • 上面的代码使流等待所有子任务完成。它将线程保存在默认执行器中。当执行器中的所有线程都因按递归调用的顺序在这里等待而耗尽时,它会被卡住吗

  • 我想这会使我的父任务等待所有子任务(在递归中,在一个场景中,我们有深度目录/文件结构)等待,并可能在线程池耗尽时导致死锁。我的线程池在这里会耗尽吗

  • 我不想等待单个递归子任务返回一个状态并检查它,而是希望通过某个全局原子变量实现它,如果我的任何一个子任务失败并返回它,该全局原子变量设置为false。我可能有多个删除任务,所以这里需要一个原子变量映射,它可以跟踪所有计划任务

  • 我不确定多线程方法是否会给您带来很多优势。瓶颈很可能是物理存储介质,这将使您的删除(这只是另一种写入磁盘的形式)在任何情况下都是连续的。我可以确认@bazza的评论。如果这是一个SSD或HDD,那么多线程文件删除只会让事情变得更糟。从技术上讲,你们两人所说的是有道理的,应该是这样的,但不知何故,我在多线程环境中获得了更好的性能。我不知道底层服务器端实现是如何管理删除的,但我在这里试图实现的是将删除对象的多线程请求传递给服务器。您应该重新考虑处理
    布尔值的方式。不要使用过时的比较,如
    …==true
    或常量,如
    Status.OK
    ,这需要我猜测它只是
    true
    。也不要使用
    …=正确
    ;您已经知道
    。除此之外,您对流的工作方式有一个基本的误解,当然,启动线程最终将等待所有子任务的完成,但它也会参与评估
    ,您只需编写
    .allMatch(返回布尔值的函数)
    
    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);