Advertisement
ander758

Module06_PrimeChecker

Apr 16th, 2019
673
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.03 KB | None | 0 0
  1. import java.util.concurrent.ExecutorService;
  2. import java.util.concurrent.Executors;
  3.  
  4. public class PrimeChecker {
  5.     private ExecutorService pool;
  6.     private boolean isPrime;
  7.     private long number;
  8.     private int numberOfThreads;
  9.     private long[] startValues;
  10.     private long[] endValues;
  11.  
  12.     private PrimeChecker(long number, int numberOfThreads) {
  13.         this.number = number;
  14.         this.numberOfThreads = numberOfThreads;
  15.         init();
  16.  
  17.         /* Output */
  18.         long startTime;
  19.         System.out.printf("You have %s available processors in your system... \n\n", Runtime.getRuntime().availableProcessors());
  20.  
  21.         //region Multi-thread
  22.         startTime = System.currentTimeMillis();
  23.         System.out.printf("Checking if %s is a prime number, multithreaded (%s threads). \n", number, numberOfThreads);
  24.         runThreads();
  25.         while (!pool.isTerminated()) // Wait for threads to finish
  26.             ;
  27.         System.out.printf("%s is%sa prime number. \nExecution time: %s ms. \n\n", number, isPrime ? " " : " not ", System.currentTimeMillis() - startTime);
  28.         //endregion
  29.  
  30.         //region Single-thread
  31.         startTime = System.currentTimeMillis();
  32.         System.out.printf("Checking if %s is a prime number, singlethreaded. \n", number);
  33.         System.out.printf("%s is%sa prime number. \nExecution time: %s ms.", number, singlethreadedPrimeCheck() ? " " : " not ", System.currentTimeMillis() - startTime);
  34.         //endregion
  35.     }
  36.  
  37.     public static void main(String[] args){
  38.         PrimeChecker primeChecker = new PrimeChecker(9223372036854775783L, 10);
  39.     }
  40.  
  41.     private void init(){
  42.         startValues = new long[numberOfThreads];
  43.         endValues = new long[numberOfThreads];
  44.  
  45.         pool = Executors.newFixedThreadPool(numberOfThreads);
  46.         long iterator = (long)(Math.sqrt(number) / numberOfThreads);
  47.  
  48.         // Partition startValues[] and endValues[] for the threads to compute
  49.         for (int i = 0; i < numberOfThreads; i++) {
  50.             if (i == 0) {
  51.                 startValues[i] = 3;
  52.                 endValues[i] = startValues[i] + iterator;
  53.             } else {
  54.                 startValues[i] = endValues[i - 1] + 1;
  55.                 endValues[i] = startValues[i] + iterator;
  56.             }
  57.             //System.out.printf("[%s] start: %s, end: %s\n", i, startValues[i], endValues[i]);
  58.         }
  59.  
  60.     }
  61.     private void runThreads(){
  62.         /* execute i PrimeTasks*/
  63.         try {
  64.             for (int i = 0; i < numberOfThreads; i++)
  65.                 pool.execute(new PrimeTask(number, startValues[i], endValues [i]));
  66.         } catch (Exception ex) {
  67.             ex.printStackTrace();
  68.             System.out.println("Could not execute the threads in the pool...");
  69.         }
  70.     }
  71.     private void notPrime(){
  72.         pool.shutdown();
  73.         isPrime = false;
  74.     }
  75.     private boolean singlethreadedPrimeCheck(){
  76.         /* Returns true if number is prime */
  77.         if (number % 2 == 0)
  78.             return false;
  79.         for (long i = 3; i <= Math.sqrt(number); i = i+2)
  80.             if (number % i == 0)
  81.                 return false;
  82.         return true;
  83.     }
  84.  
  85.     class PrimeTask implements Runnable {
  86.         private long number;
  87.         private long startValue; // Where to start checking if number is prime
  88.         private long endValue; // Where to stop checking if number is prime
  89.  
  90.         PrimeTask(long number, long startValue, long endValue){
  91.             this.number = number;
  92.             this.startValue = startValue;
  93.             this.endValue = endValue;
  94.         }
  95.  
  96.         @Override
  97.         public void run() {
  98.             if (number % 2 == 0)
  99.                 notPrime();
  100.  
  101.             for (long i = startValue; i <= endValue; i = i+2)
  102.                 if (number % i == 0)
  103.                     notPrime();
  104.  
  105.             if (endValue == endValues[numberOfThreads - 1]) { // If current thread is last thread, shutdown and isPrime is set to true
  106.                 pool.shutdown();
  107.                 isPrime = true;
  108.             }
  109.         }
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement