Java version 1.8 introduced a new implementation of the interface Future—CompletableFuture. The java.util.concurrent.CompletableFuture class can be used to asynchronously execute programs defining callbacks to handle the results. As Java 1.8 also introduced lambda expressions, the callbacks can be described using them:
public static void main(String[] args) throws ExecutionException, InterruptedException { var future = CompletableFuture.supplyAsync(() -> { var negative = true; var pi = 0.0; for (int i = 3; i < 100000; i += 2) { if (negative) pi -= (1.0 / i); else pi += (1.0 / i); negative = !negative; } pi += 1.0; pi *= 4.0; return pi; } ).thenAcceptAsync(piCalculated -> System.out.println("pi is " + piCalculated)); System.out.println("All ...