Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待主线程直到异步方法完成?_Java_Spring_Spring Boot_Asynchronous_Java 8 - Fatal编程技术网

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");