java - 如何等待主线程直到异步方法完成?

标签 java spring spring-boot asynchronous java-8

我有 Service.classstart() 方法:

public void start()  {  
    for (int i = 0; i < companiesList.size(); i++) {
        asychronous.someAsynchronous(...);
    }
    log.info("Start method has finished");
}

我有 Asynchronous.classsomeAsynchronous() 方法:

@Async("threadPoolTaskExecutor")
public CompletableFuture<Void> someAsynchronous(some_parameters) {
    //do some stuff
    return null;
}

log.info()someAsynchronous() 方法完成之前显示。 如何强制它等待 log.info() 直到循环中的 someSynchronous() 方法完成?顺便说一句:异步线程在完成循环后仍在运行。

最佳答案

CompletableFuture<Void>请求执行调用,但在所有调用在单独的线程中启动之后,for 循环结束,并且甚至在它们中的任何一个完成之前打印日志。这就是异步处理的优点 - 您不必关心它们的结果以及它们执行所需的时间。

为了实现您的愿望,您必须定期检查它们是否全部都已完成,然后再进行日志输出。

// Adds executions to the List
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < companiesList.size(); i++) {
    futures.add(asychronous.someAsynchronous(...));
}

// Periodical check
Iterator<CompletableFuture<Void>> iterator = futures.iterator();
while (iterator.hasNext()) {
    CompletableFuture<Void> future = iterator.next(); // get the next one
    if (future.isDone()) {                            // if finished...
        //...                                         // ... do an action
        iterator.remove();                            // ... and remove from the Iterator
    }
    if (!iterator.hasNext()) {                        // if you reach the end
        iterator = futures.iterator();                // ... repeat the remaining Futures
    }
}

log.info("Start method has finished");

请注意,直到所有执行完成后,此方法才会完成。


编辑:感谢@Kayaman建议使用单个 method专用于替换整个Iterator逻辑。 futures必须是一个数组:

// Adds executions to the List
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < companiesList.size(); i++) {
    futures.add(asychronous.someAsynchronous(...));
}

// Join the completion of all the threads
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();

log.info("Start method has finished");

关于java - 如何等待主线程直到异步方法完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61020134/

相关文章:

java - 如何从正在运行的程序创建可执行文件(或 JAR)?

java - 在spring和eclipse中演示微服务不起作用

spring-boot - Vue Js 和 Spring Boot 基本身份验证

java - 如何使用iText从书签在PDF文件中创建目录页?

java - map函数的方法引用,key为String类型时编译报错

spring - 创建 Set<Class<?>> 类型的 bean

java - Mockito 使用 Spring Boot 模拟 Java @Value

java - Spring-Boot 多个数据库目标依赖项

java - 我的 fragment 在替换时重叠

java - 我们可以有一个工厂类作为 spring bean 并有一个工厂方法根据条件返回多个 spring bean 吗?