如何在Spring中检查@Async调用是否已完成?
我使用@Async注释执行rsync命令的方法。 一次有十个线程调用此方法。 我的要求是在所有十个线程完成rsync命令执行之后,只有我剩下的代码应该执行但是没有得到如何检查我的所有十个线程是否完全执行了@Async方法? 所以请告诉我一个方法来检查它
如果要返回一些值,则应将返回值包装到Standard Java SE Future
或Spring的AsyncResult
,这也实现了Future
。
像这样的东西:
@Component class AsyncTask { @Async public Future call() throws InterruptedException { return new AsyncResult ("return value"); } }
如果你确实有这个,在调用者你做的事情如下:
public void kickOffAsyncTask() throws InterruptedException { Future futureResult = asyncTask.call(); //do some stuff in parallel String result = futureResult.get(); System.out.println(result); }
调用futureResult.get()
将阻塞调用程序线程并等待异步线程完成。
如果您不想永远等待Future.get(long timeout, TimeUnit unit)
可以选择使用Future.get(long timeout, TimeUnit unit)
。
编辑:
如果您不需要返回任何值,我仍然建议考虑返回虚拟返回值。 您不需要将它用于任何事情,只需用于指示特定线程已完成。 像这样的东西:
public void kickOffAsyncTasks(int execCount) throws InterruptedException { Collection> 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
。 如果由于某种原因异步调用它,那么你应该从这个方法返回Future
并等到它返回一些值。