Весна - Как запустить серию потоков и дождаться их окончания, прежде чем закончить? - PullRequest
0 голосов
/ 19 октября 2018

В настоящее время у меня есть этот код, я хотел бы использовать встроенную функциональность 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();
            }

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Если вы используете 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)

, чтобы запустить его действительно асинхронно.

0 голосов
/ 19 октября 2018

Пожалуйста, смотрите это ниже.Он использует CompletableFuture.

https://spring.io/guides/gs/async-method/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...