gpt4 book ai didi

java - Spring - 如何运行一系列线程并等待它们完成后再完成?

转载 作者:行者123 更新时间:2023-12-02 10:41:22 25 4
gpt4 key购买 nike

目前我有这段代码,我想使用内置的 Spring 功能。我将 @Async 用于一个我不关心它何时完成的方法。有没有办法使用它,但要等到池中的线程完成?

   Runnable thread = () -> {
for (String date : dates) {

Path dir = Paths.get(primaryDisk, partition, folder, date);
File tmp = dir.toFile();
deleteDir(tmp);



}
};

executor.submit(thread);

稍后在函数中我使用以下代码等待它们完成。

 executor.shutdown();

try {
executor.awaitTermination(5, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}

最佳答案

如果你使用 spring 你可以使用这样的东西

public void doSomething(Set<String> emails){
CompletableFuture.allOf(emails.stream()
.map(email -> yourService.doAsync(email)
.exceptionally(e -> {
LOG.error(e.getMessage(), e);
return null;
})
.thenAccept(longResult -> /*do something with result if needed */))
.toArray(CompletableFuture<?>[]::new))
.join();
}

此代码将启动其他线程中的每个 doAsync 方法调用,并等待所有这些任务完成。

你的 doAsync 方法

@Async
public CompletableFuture<Long> doAsync(String email){
//do something
Long result = ...
return CompletableFuture.completedFuture(result);
}

如果您的 doSomething 方法和 doAsync 方法位于同一服务类中,您应该 self 注入(inject)您的服务

@Autowired
@Lazy
private YourService yourService

并通过这个自注入(inject)引用(spring代理)调用你的@Async方法

yourService.doAsync(email)

真正异步运行它。

关于java - Spring - 如何运行一系列线程并等待它们完成后再完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52898171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com