代码之家  ›  专栏  ›  技术社区  ›  Dylan

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

  •  0
  • Dylan  · 技术社区  · 7 年前

    目前我有这个代码,我想使用内置的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 回复  |  直到 7 年前
        1
  •  1
  •   JaneXQ    7 年前

    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
    

    yourService.doAsync(email)
    

    以异步方式运行它。