java - Spring - 如何运行一系列线程并等待它们完成后再完成?
问题描述
目前我有这段代码,我想使用内置的 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();
}
解决方案
如果你使用弹簧,你可以使用这样的东西
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 方法在同一个服务类中,你应该自我注入你的服务
@Autowired
@Lazy
private YourService yourService
并通过这个自注入参考(弹簧代理)调用您的 @Async 方法
yourService.doAsync(email)
真正异步运行它。
推荐阅读
- r - 如何在 R 的“调查”包中按年龄组复制 SUDAAN 75% 和 95% 置信区间?
- javascript - RxJS-如何在操作后访问 BehaviorSubject 的值
- scala - 如何展平DataFrame中的列
- swift - account.register 的无效请求签名错误
- android - framelayout.addView(view) 重叠/删除工具栏?
- c# - 使用自定义队列处理器在 WebJobs 上获取单例行为
- ms-access - 从连续表单中删除空文本框,但显示带有数据的文本框
- wordpress - 重新排列(按优先级排序)Woocommerce 我的帐户字段
- java - 了解spring-integration service-activator
- reactjs - 使用 Create React App 运行 Jest 测试时文档为空