2014-11-05 44 views
0

我要計算素數呈現數量從110000,我分了範圍爲8線程(numbers of my CPU cores),所以每個線程必須檢查1250號碼。我不明白爲什麼在程序我」結束m如果這是輸出:的CyclicBarrier上計算質數

numbers found: 0 

的WorkerThread:

import java.util.concurrent.BrokenBarrierException; 
import java.util.concurrent.CyclicBarrier; 

public class WorkerThread extends Thread { 

    private CyclicBarrier cyclicBarrier; 
    private PrimeNumber primeNumber; 
    private int min; 
    private int max; 

    public WorkerThread(CyclicBarrier cyclicBarrier, int min, int max, 
      PrimeNumber primeNumber) { 
     this.cyclicBarrier = cyclicBarrier; 
     this.primeNumber = primeNumber; 
     this.max = max; 
     this.min = min; 
    } 

    @Override 
    public void run() { 

     primeNumber.calculatePrimeNumber(min,max); 

     try { 
      cyclicBarrier.await(); 
     } catch (InterruptedException | BrokenBarrierException e) { 
      e.printStackTrace(); 
     } 
     primeNumber.printNumbers(); 
    } 
} 

主要類:

import java.util.concurrent.CyclicBarrier; 

public class PrimeNumber { 

    private Integer totalPrimeNumber; 

    private int min; 
    private int max; 
    private int limit; 

    public PrimeNumber(int min, int max) { 
     totalPrimeNumber = new Integer(0); 
     this.min = min; 
     this.max = max; 
    } 

    public void calculatePrimeNumber(int min, int max) { 

     boolean found = false; 
     for (int i = min; i <= max; i++) { 
      for (int j = 3; j <= Math.sqrt(min); j++) { 
       if (min % 2 == 0) 
        break; 
       else if (min % j == 0) { 
        found = false; 
        break; 
       } 
       found = true; 
      } 
      if (found) { 
       totalPrimeNumber++; 
      } 
     } 
    } 

    public void printNumbers() { 
     synchronized (totalPrimeNumber) { 
      System.out.println("numbers found" + totalPrimeNumber); 
     } 

    } 

    public void setMin(int min) { 
     this.min = min; 
    } 

    public void setMax(int max) { 
     this.max = max; 
    } 

    public int getMin() { 
     return min; 
    } 

    public int getMax() { 
     return max; 
    } 

    private void setLimit(int max) { 
     this.limit = max; 
    } 

    private int getLimit() { 
     return limit; 
    } 

    public static void main(String args[]) { 

     int cores = Runtime.getRuntime().availableProcessors(); 

     CyclicBarrier cyclicBarrier = new CyclicBarrier(cores); 
     PrimeNumber primeNumber = new PrimeNumber(1, 10000); 

     int numberToCheck = primeNumber.getMax() - primeNumber.getMin(); 
     int numberToDivide = numberToCheck/cores; 

     primeNumber.setMin(1); 
     primeNumber.setLimit(primeNumber.getMax()); 
     primeNumber.setMax(numberToDivide); 

     for (int i = 0; i < cores; i++) { 
      if (i == 7) { 
       primeNumber.setMax(primeNumber.getLimit()); 
       WorkerThread workerThread = new WorkerThread(cyclicBarrier, 
         primeNumber.getMin(), primeNumber.getMax(), primeNumber); 
       workerThread.start(); 
      } else { 
       WorkerThread workerThread = new WorkerThread(cyclicBarrier, 
         primeNumber.getMin(), primeNumber.getMax(), primeNumber); 
       workerThread.start(); 
       primeNumber.setMin(primeNumber.getMax() + 1); 
       primeNumber.setMax(primeNumber.getMax() + numberToDivide); 
      } 
     } 

    } 

} 

回答

2

你永遠只能測試min

for (int j = 3; j <= Math.sqrt(min); j++) { 
    if (min % 2 == 0) // min never changes 
     break; 
    else if (min % j == 0) 

最有可能你打算在你使用的每種情況下測試imin

這是使用調試器或編寫單元測試會爲你解決這個問題的地方。

我假設目的是查看大量正在使用的CPU。如果你想要速度,你可以優化很多,但我懷疑在一個線程中的Sieve of Eratosthenes會更快。

+0

你是對的......分心...... – user582040 2014-11-05 16:11:24

+0

我可以請你澄清'calculatePrimeNumber'嗎?我在這裏有疑問,如果每個trhreads同時進入這裏,他們可以互相干擾嗎?我想不,因爲變數都是本地的。 – user582040 2014-11-05 16:14:46

+0

@ user582040你是對的,他們不能干涉,因爲每個方法都傳遞了一個本地到該線程的副本。 – 2014-11-05 16:18:31