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.