我有 Service.class 和 start()
方法:
public void start() {
for (int i = 0; i < companiesList.size(); i++) {
asychronous.someAsynchronous(...);
}
log.info("Start method has finished");
}
我有 Asynchronous.class 和 someAsynchronous()
方法:
@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/