From 040f33ff04d912912b66433d7b58c559b2b6025d Mon Sep 17 00:00:00 2001 From: Fabio Scotto di Santolo Date: Wed, 4 Dec 2019 18:15:58 +0100 Subject: [PATCH] Prove sulla concorrenza con ComposableFuture --- .../org/gym/fp/moderjava/ConcurrencyTest.java | 37 +++++++++++++++--- .../org/gym/fp/moderjava/concurrent/Shop.java | 39 +++++++++++++++++++ 2 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 modern-java/src/main/java/org/gym/fp/moderjava/concurrent/Shop.java diff --git a/modern-java/src/main/java/org/gym/fp/moderjava/ConcurrencyTest.java b/modern-java/src/main/java/org/gym/fp/moderjava/ConcurrencyTest.java index c801026..4f90cbd 100644 --- a/modern-java/src/main/java/org/gym/fp/moderjava/ConcurrencyTest.java +++ b/modern-java/src/main/java/org/gym/fp/moderjava/ConcurrencyTest.java @@ -1,9 +1,10 @@ package org.gym.fp.moderjava; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; +import org.gym.fp.moderjava.concurrent.Shop; + +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.*; import static java.lang.System.out; @@ -11,9 +12,10 @@ public class ConcurrencyTest { public static void main(String[] args) throws Exception { doExecutorsServiceTest(); + doFutureTest(); } - private static void doExecutorsServiceTest() throws ExecutionException, InterruptedException { + private static void doExecutorsServiceTest() throws Exception { int x = 1337; ExecutorService executorService = Executors.newFixedThreadPool(2); Future y = executorService.submit(() -> f(x)); @@ -22,6 +24,18 @@ public class ConcurrencyTest { executorService.shutdown(); } + private static void doFutureTest() throws Exception { + Collection shops = getShops(); + Future future = CompletableFuture.supplyAsync(() -> { + out.println("Primo completable future"); + return 10; + }).thenCombine(CompletableFuture.supplyAsync(() -> { + out.println("Secondo completable future"); + return 30; + }), (first, second) -> first + second); + out.println(future.get(1, TimeUnit.NANOSECONDS)); + } + static int f(int x) { return 42; } @@ -30,4 +44,17 @@ public class ConcurrencyTest { return x; } + static Collection getShops() { + return Arrays.asList( + new Shop("BestShop1"), + new Shop("BestShop2"), + new Shop("BestShop3"), + new Shop("BestShop4"), + new Shop("BestShop5"), + new Shop("BestShop6"), + new Shop("BestShop7"), + new Shop("BestShop8") + ); + } + } diff --git a/modern-java/src/main/java/org/gym/fp/moderjava/concurrent/Shop.java b/modern-java/src/main/java/org/gym/fp/moderjava/concurrent/Shop.java new file mode 100644 index 0000000..8475b6c --- /dev/null +++ b/modern-java/src/main/java/org/gym/fp/moderjava/concurrent/Shop.java @@ -0,0 +1,39 @@ +package org.gym.fp.moderjava.concurrent; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.ToString; + +import java.util.Random; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +@ToString +@AllArgsConstructor +public class Shop { + + @Getter + private String name; + + public double getPrice(String product) { + return calculatePrice(product); + } + + public Future getPriceAsync(String product) { + return CompletableFuture.supplyAsync(() -> calculatePrice(product)); + } + + private double calculatePrice(String product) { + delay(); + return new Random().nextDouble() * product.charAt(0) + product.charAt(1); + } + + static void delay() { + try { + Thread.sleep(1000L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + +}