import java.util.concurrent.*; import java.util.function.*; import java.util.stream.*; import java.util.*; import com.ning.http.client.*; import java.io.*; import java.net.*; public class App{ static String getData(String uri){ try( BufferedReader resp = new BufferedReader(new InputStreamReader(new URL(uri).openStream()))) { String line, result = ""; while ((line = resp.readLine()) != null) { result += line; } return result; } catch (Exception e) { throw new RuntimeException(e); } } static Future<String> getDataAsync(String uri){ return CompletableFuture.supplyAsync(() -> getData(uri)); } static CompletableFuture<String> getDataAsyncNio(String uri){ AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); CompletableFuture<String> promise = new CompletableFuture<>(); asyncHttpClient .prepareGet(uri) .execute(new AsyncCompletionHandler<Response>(){ @Override public Response onCompleted(Response response) throws Exception{ promise.complete(response.getResponseBody()); return response; } }); return promise; } public static void main(String [] args) throws Exception{ final String [] competitors = {"AAPL", "MSFT", "IBM","BBRY", "GOOG", "SNDK", "HPQ", "YNDX","BIDU","YHOO"}; final String stockDetails = "http://api.monitr.com/api/v2/symbol?apikey=1e3f8640-f754-11e3-97e9-179fff8a3cc5&symbol=%s"; long duration; System.out.println("Warm-up..."); getData(String.format(stockDetails, "AAPL")).substring(0, 30); getDataAsyncNio(String.format(stockDetails, "AAPL")).get().substring(0, 30); System.out.println("READY"); System.out.println(); duration = measurePerformance( () -> { Arrays.stream(competitors) .map(stock -> String.format(stockDetails, stock)) .map(uri -> getData(uri)) .forEach(r -> System.out.println(r.substring(0, 30))); }); System.out.println("Sequential: " + duration + " ms"); System.out.println(); duration = measurePerformance( () -> { List<Future<String>> res = Arrays.stream(competitors) .map(stock -> String.format(stockDetails, stock)) .map(uri -> getDataAsync(uri)) .collect(Collectors.toList()); for(Future<String> f : res) System.out.println(f.get().substring(0, 30)); }); System.out.println("ForkJoinPool: " + duration + " ms"); System.out.println(); duration = measurePerformance( () -> { Stream<CompletableFuture> res = Arrays.stream(competitors) .map(stock -> String.format(stockDetails, stock)) .map(uri -> getDataAsyncNio(uri)) .map(f -> f .thenApply(s -> s.substring(0, 30)) .thenAccept(System.out::println)); }); System.out.println("Http Async Client NIO: " + duration + " ms"); System.out.println(); Scanner in = new Scanner(System.in); in.nextLine(); } public static long measurePerformance(RunnableThrowable action) throws Exception { long fastest = Long.MAX_VALUE; for (int i = 0; i < 1; i++) { long start = System.nanoTime(); action.run(); long duration = (System.nanoTime() - start) / 1_000_000; // micro seconds if (duration < fastest) fastest = duration; } return fastest; } interface RunnableThrowable{ public void run() throws Exception; } }