Java 如何等待主线程直到异步方法完成?
我有服务。使用Java 如何等待主线程直到异步方法完成?,java,spring,spring-boot,asynchronous,java-8,Java,Spring,Spring Boot,Asynchronous,Java 8,我有服务。使用start()方法初始化: public void start() { for (int i = 0; i < companiesList.size(); i++) { asychronous.someAsynchronous(...); } log.info("Start method has finished"); } @Async("threadPoolTaskExecutor") public CompletableFu
start()
方法初始化:
public void start() {
for (int i = 0; i < companiesList.size(); i++) {
asychronous.someAsynchronous(...);
}
log.info("Start method has finished");
}
@Async("threadPoolTaskExecutor")
public CompletableFuture<Void> someAsynchronous(some_parameters) {
//do some stuff
return null;
}
log.info()
在someAsynchronous()
方法完成之前显示。
如何强制它等待
log.info()
直到someSynchronous()
循环中的方法完成?顺便说一句:异步线程在完成循环后仍在运行 请求执行CompletableFuture
调用,但在所有调用在单独的线程中启动后,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");
当然,它之前已经出现了,这就是异步执行方法的全部要点。你确定这个方法应该是异步的吗?但是你仍然可以得到
CompletableFuture
s并等待它们。@Kayaman它们是在新的独立线程中执行的,这很好,但我想让它们完成,然后让主线程继续。用CompletableFuture.allOf(futures).join()替换迭代器代码>。无需旋转主线程或设计迭代器。谢谢Kayaman,这是一个很好的提示。多线程是我的弱点。是的,CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]).join();
,它是一个varargs参数。@januszj迭代器可以用它代替。或者.forEach()
@Kayaman迭代器是什么意思?迭代器迭代器迭代器=CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join()?
// 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");