春季-如何运行一系列线程并在完成之前等待它们完成?

时间:2018-10-19 18:34:54

标签: java spring multithreading spring-boot asynchronous

当前我有这段代码,我想使用内置的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 :(得分:1)

如果您使用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

并通过此自注入引用(spring proxy)调用您的@Async方法

yourService.doAsync(email)

使其真正地异步运行。

答案 1 :(得分:0)

请在下面查看。它使用CompletableFuture

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