gpt4 book ai didi

java - cycloBarrier 计算素数

转载 作者:行者123 更新时间:2023-12-02 05:17:56 26 4
gpt4 key购买 nike

我必须计算 1 中出现的素数的数量至10000 ,我将范围分为 8线程( numbers of my CPU cores ),因此每个线程都必须检查 1250数字。我不明白为什么在程序结束时我得到这个输出:

numbers found: 0

工作线程:

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 被使用。如果你想要速度,你可以优化它很多,尽管我怀疑 Sieve of Eratosthenes在一个线程中会快得多。

关于java - cycloBarrier 计算素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26761736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com