/* PrimeCounterBetterLoad.java * Use Java threading to count the number of prime * numbers between 0 and a large number N * * The load balancing is not great in this version * * javac PrimeCounterBetterLoad.java * java PrimeCounterBetterLoad */ public class PrimeCounterBetterLoad implements Runnable { private int id; private int N; private int chunk_size; private int num_threads; private int count; public PrimeCounterBetterLoad (int id, int N, int chunk_size, int num_threads) { this.id = id; this.N = N; this.chunk_size = chunk_size; this.num_threads = num_threads; this.count = 0; } public boolean is_prime (int n) { if (n < 2) return false; if (n == 2) return true; if (n%2 == 0) return false; for (int i = 3; i < n; i += 2) { if (n % i == 0) return false; } return true; } public void run () { int start = this.chunk_size * this.id; for (int i = start; i < N; i = i + chunk_size*num_threads ) { for (int j = 0; j < chunk_size; j++) { if (is_prime(i+j)) count += 1; } } } public int count () { return count; } public static void main (String args[]) { int N = 1000000; int chunk_size = 100; int NUM_THREADS = 8; PrimeCounterBetterLoad pc[] = new PrimeCounterBetterLoad[NUM_THREADS]; Thread threads[] = new Thread[NUM_THREADS]; for (int i = 0; i < NUM_THREADS; i++ ) { pc[i] = new PrimeCounterBetterLoad(i, N, chunk_size, NUM_THREADS); threads[i] = new Thread(pc[i]); } PrimeCounterBetterLoad pc0 = new PrimeCounterBetterLoad(0, N, N, 1); Thread t0 = new Thread(pc0); long start = System.currentTimeMillis(); for (int i = 0; i < NUM_THREADS; i++) threads[i].start(); try { for (int i = 0; i < NUM_THREADS; i++) threads[i].join(); } catch (Exception e) { System.err.println(e); } int count = 0; for (int i = 0; i < NUM_THREADS; i++) count += pc[i].count(); long end = System.currentTimeMillis(); System.out.printf("Multi-threads count %d primes in %d ms\n", count, end-start); // Time sequential solution, but using 1 thread start = System.currentTimeMillis(); t0.start(); try { t0.join(); } catch (Exception e) { System.err.println(e); } count = pc0.count(); end = System.currentTimeMillis(); System.out.printf("One threads count %d primes in %d ms\n", count, end-start); } }