简体   繁体   中英

cyclicBarrier on calculate prime numbers

i have to calculate the number of the prime numbers presents from 1 to 10000 , i divided the range into 8 threads ( numbers of my CPU cores ) so each thread has to check 1250 numbers. I don't understand why at the end of the program i' m getting this as output:

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();
    }
}

Main class:

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);
            }
        }

    }

}

You only ever test the min value

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

Most likely you intended to test i in each case where you use min

This is where using a debugger or writing unit tests would have solved this problem for you.

I assume the purpose is to see lots of CPU being used. If you wanted speed, you could optimise this a lot though I suspect the Sieve of Eratosthenes in one thread will be much faster.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM