See More

import java.util.concurrent.Executor; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.net.URI; import java.net.http.HttpRequest; import java.net.http.HttpClient; import java.time.Duration; import java.io.IOException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.http.HttpResponse.BodyHandlers; /** * fib of 47 takes ~11s * fib of 49 fakes ~30s */ public class Fibonacci { public static long fib(int n) { if (n <= 2) return 1; return fib(n - 1) + fib(n - 2); } public static CompletableFuture parallelFib(int n, Executor executor) { CompletableFuture partOne = CompletableFuture.supplyAsync(() -> fib(n - 1), executor); CompletableFuture partTwo = CompletableFuture.supplyAsync(() -> fib(n - 2), executor); return partOne.thenCombineAsync(partTwo, (resultOne, resultTwo) -> resultOne + resultTwo, executor); } public static CompletableFuture fibWithRequest(int i, int n, Executor executor) { return CompletableFuture.supplyAsync(() -> fib(n), executor) .thenComposeAsync(result -> { var request = HttpRequest.newBuilder() .GET() .uri(URI.create("https://httpbin.org/delay/5")) .build(); var httpClient = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .connectTimeout(Duration.ofSeconds(30)) .executor(executor) .build(); try { System.out.printf("Thread %d - requesting%n", i); return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApplyAsync(resp -> result); } catch (Exception ex) { throw new RuntimeException(ex); } }, executor); } }