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

我对执行rsync命令的方法使用 批注。一次有

调用此方法。我的要求是,在所有十个线程都完成rsync命令执行之后,才应该执行我剩下的代码,但无法获取如何检查所有十个线程是否已完全执行@Async方法?所以请告诉我一种检查方法

回答:

如果要返回一些值,则应将返回值包装到Standard 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

}

以上是 如何检查@Async调用在Spring中完成? 的全部内容, 来源链接: utcz.com/qa/419180.html

回到顶部