I have an application where for a certain number of times something needs to be calculated. This calculation function has the annotation @Async (from the Spring Framework), that
An alternative is to return a ListenableFuture and to use a CountDownLatch.
@Async
public ListenableFuture executeBla() {
try {
System.out.println("Bla!");
return AsyncResult.forValue(null);
} catch (Throwable t) {
return AsyncResult.forExecutionException(t);
}
}
This scenario allows you to avoid explicitly calling future.get() for each future. You accomplish this by adding success and failure callbacks which in turn decrement the CountDownLatch, which was created exactly for this purpose.
public void executeBlaALotOfTimes() {
long before = System.currentTimeMillis();
int numExecutions = 40000;
CountDownLatch countDownLatch = new CountDownLatch(numExecutions);
for (int i = 0; i future = executeBla();
future.addCallback(
aVoid -> countDownLatch.countDown(),
throwable -> countDownLatch.countDown()
);
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
// Handle exception
} finally {
long after = System.currentTimeMillis();
System.out.println("Time it took for a lot of bla to execute: " + (after - before) / 1000.0 + " seconds.");
}
}