diff --git a/u07-1/PrimeTester.java b/u07-1/PrimeTester.java new file mode 100644 index 0000000..95eafd8 --- /dev/null +++ b/u07-1/PrimeTester.java @@ -0,0 +1,63 @@ +import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +class PrimeTester { + public static void main(String[] args) throws InterruptedException { + final AtomicInteger primeCount = new AtomicInteger(); + final Random random = new Random(); + ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + + for (int i = 0; i < 100; i++) { + final int start; + final int end; + + if (i == 0) { // only start at 2 + start = 2; + } else { + start = i * 100; + } + + if (i == 99) { // end at 100.000 instead of 99.999 + end = 100_001; + } else { + end = (i + 1) * 100; + } + + Runnable t = () -> { + System.out.println("Testing " + start + " to " + (end - 1)); + for (int j = start; j < end; j++) { + if (isPrime(j)) { + primeCount.incrementAndGet(); + } + if (j == start / end) { + try { + Thread.sleep(random.nextInt(0, 100)); + } catch (InterruptedException e) { + System.out.println("Thread interrupted: " + e.getMessage()); + return; + } + } + } + }; + executor.execute(t); + } + + executor.shutdown(); + executor.awaitTermination(10, TimeUnit.SECONDS); + System.out.println("Total prime numbers: " + primeCount.get()); + } + + private static boolean isPrime(int n) { + if (n < 2) return false; + if (n == 2) return true; + for (int d = 2; d < n; d++) { + if (n % d == 0) { + return false; + } + } + return true; + } +} \ No newline at end of file