Java 删除递归嵌套目录时在其内部执行多线程
我试图删除一个非常大的嵌套目录结构,其中包含多个文件和子目录。每个子目录中可以有多个文件和子目录Java 删除递归嵌套目录时在其内部执行多线程,java,multithreading,recursion,parallel-processing,java-8,Java,Multithreading,Recursion,Parallel Processing,Java 8,我试图删除一个非常大的嵌套目录结构,其中包含多个文件和子目录。每个子目录中可以有多个文件和子目录 所以我们只能在这里删除一个文件或一个空目录。如果一个目录不是空的,并且有更多的文件和子目录,请列出这些子目录和文件,并在递归中删除它们 我在这里编写了一个伪代码,并使用并行流在递归中删除列表 上面的代码使流等待所有子任务完成。它将线程保存在默认执行器中。当执行器中的所有线程都因按递归调用的顺序在这里等待而耗尽时,它会被卡住吗 我想这会使我的父任务等待所有子任务(在递归中,在一个场景中,我们有深度目录
我不确定多线程方法是否会给您带来很多优势。瓶颈很可能是物理存储介质,这将使您的删除(这只是另一种写入磁盘的形式)在任何情况下都是连续的。我可以确认@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);