From 63af3ee0be9acf9cc270408cec6082ec642504ae Mon Sep 17 00:00:00 2001 From: AndyC5H10O5 <1915965336@qq.com> Date: Fri, 19 Jul 2024 20:32:40 +0800 Subject: [PATCH] Fix busy-waiting loops for Server Session / App.java --- .../java/com/iluwatar/sessionserver/App.java | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/server-session/src/main/java/com/iluwatar/sessionserver/App.java b/server-session/src/main/java/com/iluwatar/sessionserver/App.java index a3c66d3ff634..8be50f381be7 100644 --- a/server-session/src/main/java/com/iluwatar/sessionserver/App.java +++ b/server-session/src/main/java/com/iluwatar/sessionserver/App.java @@ -31,6 +31,9 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; /** @@ -75,37 +78,34 @@ public static void main(String[] args) throws IOException { server.start(); // Start background task to check for expired sessions - sessionExpirationTask(); + startSessionExpirationTask(); LOGGER.info("Server started. Listening on port 8080..."); } - private static void sessionExpirationTask() { - new Thread(() -> { - while (true) { - try { - LOGGER.info("Session expiration checker started..."); - Thread.sleep(SESSION_EXPIRATION_TIME); // Sleep for expiration time - Instant currentTime = Instant.now(); - synchronized (sessions) { - synchronized (sessionCreationTimes) { - Iterator> iterator = - sessionCreationTimes.entrySet().iterator(); - while (iterator.hasNext()) { - Map.Entry entry = iterator.next(); - if (entry.getValue().plusMillis(SESSION_EXPIRATION_TIME).isBefore(currentTime)) { - sessions.remove(entry.getKey()); - iterator.remove(); - } + private static void startSessionExpirationTask() { + ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + Runnable sessionExpirationChecker = () -> { + try { + LOGGER.info("Session expiration checker started..."); + Instant currentTime = Instant.now(); + synchronized (sessions) { + synchronized (sessionCreationTimes) { + Iterator> iterator = sessionCreationTimes.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + if (entry.getValue().plusMillis(SESSION_EXPIRATION_TIME).isBefore(currentTime)) { + sessions.remove(entry.getKey()); + iterator.remove(); } } } - LOGGER.info("Session expiration checker finished!"); - } catch (InterruptedException e) { - LOGGER.error("An error occurred: ", e); - Thread.currentThread().interrupt(); } + LOGGER.info("Session expiration checker finished!"); + } catch (Exception e) { + LOGGER.error("An error occurred: ", e); } - }).start(); + }; + scheduler.scheduleAtFixedRate(sessionExpirationChecker, 0, SESSION_EXPIRATION_TIME, TimeUnit.MILLISECONDS); } -} \ No newline at end of file +}