[英]cyclicBarrier on calculate prime numbers
我必须计算从1
到10000
的素数的数量,我将范围划分为8
线程( numbers of my CPU cores
),因此每个线程必须检查1250
数字。 我不明白为什么在程序结束时将其作为输出:
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);
}
}
}
}
您只能测试min
for (int j = 3; j <= Math.sqrt(min); j++) {
if (min % 2 == 0) // min never changes
break;
else if (min % j == 0)
您最有可能打算在每种情况下使用min
来测试i
在这里,使用调试器或编写单元测试将为您解决此问题。
我认为目的是要看到大量的CPU被使用。 如果您想提高速度,可以优化此速度,尽管我怀疑同一线程中的Eratosthenes筛将更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.