From caadb157e370ffc70b2ebc12d493b276ecc42556 Mon Sep 17 00:00:00 2001 From: kastashenkova Date: Tue, 17 Mar 2026 23:02:01 +0200 Subject: [PATCH 1/3] develop asynchronous request --- .../mate/academy/AsyncRequestProcessor.java | 17 ++++++++++++++++- src/main/java/mate/academy/Main.java | 6 ++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/mate/academy/AsyncRequestProcessor.java b/src/main/java/mate/academy/AsyncRequestProcessor.java index ee5eea1..415f634 100644 --- a/src/main/java/mate/academy/AsyncRequestProcessor.java +++ b/src/main/java/mate/academy/AsyncRequestProcessor.java @@ -1,9 +1,12 @@ package mate.academy; +import java.util.Map; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; public class AsyncRequestProcessor { + private static final Map cache = new ConcurrentHashMap<>(); private final Executor executor; public AsyncRequestProcessor(Executor executor) { @@ -11,6 +14,18 @@ public AsyncRequestProcessor(Executor executor) { } public CompletableFuture processRequest(String userId) { - return null; + return CompletableFuture.supplyAsync(() -> getUserData(userId), + executor); + } + + private static UserData getUserData(String userId) { + UserData res; + if (cache.get(userId) != null) { + res = cache.get(userId); + } else { + res = new UserData(userId, "Details for " + userId); + cache.put(userId, res); + } + return res; } } diff --git a/src/main/java/mate/academy/Main.java b/src/main/java/mate/academy/Main.java index a3c9b9e..1799413 100644 --- a/src/main/java/mate/academy/Main.java +++ b/src/main/java/mate/academy/Main.java @@ -2,14 +2,13 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class Main { public static void main(String[] args) { - // Feel free to play with AsyncRequestProcessor in this main method if you want - ExecutorService executor = null; // Provide implementation that fits your needs + ExecutorService executor = Executors.newCachedThreadPool(); AsyncRequestProcessor asyncRequestProcessor = new AsyncRequestProcessor(executor); - // Simulating multiple concurrent requests String[] userIds = {"user1", "user2", "user3", "user1"}; // Note: "user1" is repeated CompletableFuture[] futures = new CompletableFuture[userIds.length]; @@ -19,7 +18,6 @@ public static void main(String[] args) { .thenAccept(userData -> System.out.println("Processed: " + userData)); } - // Wait for all futures to complete CompletableFuture.allOf(futures).join(); executor.shutdown(); } From 6122722e42744373c7df910c985657402f616812 Mon Sep 17 00:00:00 2001 From: kastashenkova Date: Tue, 17 Mar 2026 23:13:15 +0200 Subject: [PATCH 2/3] fix thread-safety and style --- .../mate/academy/AsyncRequestProcessor.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/mate/academy/AsyncRequestProcessor.java b/src/main/java/mate/academy/AsyncRequestProcessor.java index 415f634..59a02f6 100644 --- a/src/main/java/mate/academy/AsyncRequestProcessor.java +++ b/src/main/java/mate/academy/AsyncRequestProcessor.java @@ -14,18 +14,14 @@ public AsyncRequestProcessor(Executor executor) { } public CompletableFuture processRequest(String userId) { - return CompletableFuture.supplyAsync(() -> getUserData(userId), - executor); - } - - private static UserData getUserData(String userId) { - UserData res; - if (cache.get(userId) != null) { - res = cache.get(userId); - } else { - res = new UserData(userId, "Details for " + userId); - cache.put(userId, res); - } - return res; + return CompletableFuture.supplyAsync(() -> { + try { + Thread.sleep(1000); + return cache.computeIfAbsent(userId, + id -> new UserData(id, "Details for " + userId)); + } catch (InterruptedException e) { + throw new RuntimeException("Error while processing request: " + userId, e); + } + }, executor); } } From 3ba54b5649288e994aa78daf12136b0ec3221fec Mon Sep 17 00:00:00 2001 From: kastashenkova Date: Tue, 17 Mar 2026 23:23:20 +0200 Subject: [PATCH 3/3] fix thread-safety and style --- .../mate/academy/AsyncRequestProcessor.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/mate/academy/AsyncRequestProcessor.java b/src/main/java/mate/academy/AsyncRequestProcessor.java index 59a02f6..6a41bca 100644 --- a/src/main/java/mate/academy/AsyncRequestProcessor.java +++ b/src/main/java/mate/academy/AsyncRequestProcessor.java @@ -14,14 +14,16 @@ public AsyncRequestProcessor(Executor executor) { } public CompletableFuture processRequest(String userId) { - return CompletableFuture.supplyAsync(() -> { - try { - Thread.sleep(1000); - return cache.computeIfAbsent(userId, - id -> new UserData(id, "Details for " + userId)); - } catch (InterruptedException e) { - throw new RuntimeException("Error while processing request: " + userId, e); - } - }, executor); + return CompletableFuture.supplyAsync(() -> + cache.computeIfAbsent(userId, id -> { + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException( + "Error while processing request: " + id, e); + } + return new UserData(id, "Details for " + id); + }), executor); } }