java - 如何检查@Async调用在Spring中完成?

标签 java spring spring-mvc asynchronous

我对执行 rsync 命令的方法使用@Async注释。一次有十个线程调用此方法。我的要求是在所有十个线程完成 rsync 命令执行之后,只有我剩余的代码应该执行,但不知道如何检查我的所有十个线程是否完全执行了 @Async 方法?所以请告诉我一种检查方法

最佳答案

如果您要返回某个值,则应该将返回值包装到标准 Java SE Future 或 Spring 的 AsyncResult 中。 ,它也实现了 Future

类似这样的事情:

@Component
class AsyncTask {
  @Async
  public Future<String> call() throws InterruptedException {
    return new AsyncResult<String>("return value");
  }
}

如果你确实做到了这一点,那么在调用者中你会执行以下操作:

public void kickOffAsyncTask() throws InterruptedException {
  Future<String> futureResult =  asyncTask.call();

  //do some stuff in parallel

  String result = futureResult.get();
  System.out.println(result);
}

调用 futureResult.get() 将阻塞调用者线程并等待异步线程完成。

如果您不想永远等待,您可以选择使用 Future.get(long timeout, TimeUnit unit)

编辑:

如果你不需要返回任何值,我仍然建议考虑返回虚拟返回值。您不需要将其用于任何用途,只需用于指示特定线程已完成。像这样的事情:

public void kickOffAsyncTasks(int execCount) throws InterruptedException {
  Collection<Future<String>> results = new ArrayList<>(execCount);

  //kick off all threads
  for (int idx = 0; idx < execCount; idx++) {
    results.add(asyncTask.call());
  }

  // wait for all threads
  results.forEach(result -> {
    try {
      result.get();
    } catch (InterruptedException | ExecutionException e) {
      //handle thread error
    }
  });

  //all threads finished
}

关于java - 如何检查@Async调用在Spring中完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29181057/

相关文章:

java - 如何在不修改 DAO 类的情况下指定使用哪个实体管理器工厂?

javascript - jsp页面只显示视频缩略图

java - JPA - 删除时出现 ConstraintViolationException

java - 通过 child build 者

java arraylist 对象的总和

java - 如何在 WebSphere Liberty Batch 中配置事务超时?

java.lang.ClassCastException : org. springframework.security.core.userdetails.User 无法转换为 model.User

java - Spring 启动组件扫描问题

spring - 如何使用 JAX-RS、Spring 和 JPA 管理事务

spring - 如何访问 Thymeleaf 中包含点的 Spring MVC 模型属性名称