您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

如果要返回一些值,则应将返回值包装到Standard Java SEFuture或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 2022/1/1 18:15:35 有495人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶