CompletableFuture没有等待子线程



我正试图等待processor.processFiles()完成,该方法返回void,它是一个@Async方法。忙碌等待逻辑不会导致进程等待方法完成。有人能指出我遗漏了什么吗?

try{
filesList.forEach(files -> {
List<CompletableFuture<Void>> completableFutures  = new ArrayList<>();
files.forEach(file-> {
CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(() -> 
processor.processFiles());
completableFutures.add(completableFuture);
});
while(true) {
Thread.sleep(5000);
boolean isComplete = completableFutures.stream().allMatch(result -> result.isDone() == true);
if(isComplete){
break;
}
LOGGER.info("processing the file...");
}
});
} 
catch(Exception e){
}
finally{
closeConnections();
}

我觉得你把事情弄得太复杂了。

fileList.flatMap(List::stream).parallel().forEach(file -> processor.processFiles());

forEach将并行运行,并在处理完所有文件后返回。

至少,不要使用副作用来填充List

List<CompletableFuture<Void>> completableFutures  = files.stream().map(
file ->  CompletableFuture.runAsync(() -> processor.processFiles());
).collect( Collectors.toList());

我同意这个评论。

CompletableFuture<Void> all = CompletableFuture.allOf( completableFutures );

然后你可以使用get,它将等待直到任务完成。

另一种方法是跳过List + CompletableFuture。并返回一个可完成的future

CompletableFuture<Void> all = files.stream().map(
file ->  CompletableFuture.runAsync(
() -> processor.processFiles()
)
).collect( 
Collectors.reducing( 
CompletableFuture.completedFuture(null), CompletableFuture::allOf
)
);

这将映射file到一个CompletableFuture,然后合并所有的结果可完成的未来到一个单一的可完成的未来。你可以调用。get,当一切都完成时,它会返回。

最新更新