Если вы используете 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 находятся в одном и том же классе обслуживания, вы должны самостоятельно внедрить свой сервис
@Autowired
@Lazy
private YourService yourService
и вызвать метод @Async через эту самоинъекционную ссылку (весенний прокси-сервер))
yourService.doAsync(email)
, чтобы запустить его действительно асинхронно.