diff --git a/monitor/src/main/java/com/iluwatar/monitor/Bank.java b/monitor/src/main/java/com/iluwatar/monitor/Bank.java index 6ff65f28c..3f19e0f59 100644 --- a/monitor/src/main/java/com/iluwatar/monitor/Bank.java +++ b/monitor/src/main/java/com/iluwatar/monitor/Bank.java @@ -78,12 +78,14 @@ public class Bank { if (accounts[accountA] >= amount) { accounts[accountB] += amount; accounts[accountA] -= amount; - LOGGER.info( - "Transferred from account: {} to account: {} , amount: {} , balance: {}", - accountA, - accountB, - amount, - getBalance()); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug( + "Transferred from account: {} to account: {} , amount: {} , balance: {}", + accountA, + accountB, + amount, + getBalance()); + } } } diff --git a/monitor/src/main/java/com/iluwatar/monitor/Main.java b/monitor/src/main/java/com/iluwatar/monitor/Main.java index 8b2e8ab47..923c720d8 100644 --- a/monitor/src/main/java/com/iluwatar/monitor/Main.java +++ b/monitor/src/main/java/com/iluwatar/monitor/Main.java @@ -25,7 +25,7 @@ package com.iluwatar.monitor; import java.security.SecureRandom; -import java.util.concurrent.ExecutorService; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import lombok.extern.slf4j.Slf4j; @@ -40,20 +40,26 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class Main { + private static final int NUMBER_OF_THREADS = 5; + /** * Runner to perform a bunch of transfers and handle exception. * - * @param bank bank object + * @param bank bank object + * @param latch signal finished execution */ - public static void runner(Bank bank) { + public static void runner(Bank bank, CountDownLatch latch) { try { SecureRandom random = new SecureRandom(); Thread.sleep(random.nextInt(1000)); + LOGGER.info("Start transferring..."); for (int i = 0; i < 1000000; i++) { bank.transfer(random.nextInt(4), random.nextInt(4), random.nextInt()); } + LOGGER.info("Finished transferring."); + latch.countDown(); } catch (InterruptedException e) { - LOGGER.info(e.getMessage()); + LOGGER.error(e.getMessage()); Thread.currentThread().interrupt(); } } @@ -63,12 +69,15 @@ public class Main { * * @param args command line args */ - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { var bank = new Bank(4, 1000); - Runnable runnable = () -> runner(bank); - ExecutorService executorService = Executors.newFixedThreadPool(5); - for (int i = 0; i < 5; i++) { - executorService.execute(runnable); + var latch = new CountDownLatch(NUMBER_OF_THREADS); + var executorService = Executors.newFixedThreadPool(NUMBER_OF_THREADS); + + for (int i = 0; i < NUMBER_OF_THREADS; i++) { + executorService.execute(() -> runner(bank, latch)); } + + latch.await(); } } diff --git a/monitor/src/test/java/com/iluwatar/monitor/MainTest.java b/monitor/src/test/java/com/iluwatar/monitor/MainTest.java index 360a897fd..4d1c21737 100644 --- a/monitor/src/test/java/com/iluwatar/monitor/MainTest.java +++ b/monitor/src/test/java/com/iluwatar/monitor/MainTest.java @@ -25,6 +25,7 @@ package com.iluwatar.monitor; import org.junit.jupiter.api.Test; +import java.util.concurrent.CountDownLatch; import static org.junit.jupiter.api.Assertions.*; /** Test if the application starts without throwing an exception. */ @@ -38,6 +39,9 @@ class MainTest { @Test void RunnerExecuteWithoutException() { var bank = new Bank(4, 1000); - assertDoesNotThrow(() -> Main.runner(bank)); + var latch = new CountDownLatch(1); + + assertDoesNotThrow(() -> Main.runner(bank, latch)); + assertEquals(0, latch.getCount()); } } diff --git a/monitor/src/test/resources/logback.xml b/monitor/src/test/resources/logback.xml new file mode 100644 index 000000000..ce9892722 --- /dev/null +++ b/monitor/src/test/resources/logback.xml @@ -0,0 +1,35 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + +