首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于计算素数的cyclicBarrier

关于计算素数的cyclicBarrier
EN

Stack Overflow用户
提问于 2014-11-05 16:06:45
回答 1查看 119关注 0票数 0

我必须计算从110000的质数,我将范围划分为8线程(numbers of my CPU cores),因此每个线程都必须检查1250编号。我不明白为什么在程序结束时,我会把它作为输出:

代码语言:javascript
复制
numbers found: 0

workerThread:

代码语言:javascript
复制
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();
    }
}

主修班:

代码语言:javascript
复制
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);
            }
        }

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-05 16:09:47

您只测试过min

代码语言:javascript
复制
for (int j = 3; j <= Math.sqrt(min); j++) {
    if (min % 2 == 0) // min never changes
        break;
    else if (min % j == 0)

很可能您打算在每次使用i的情况下测试min

在这里,使用调试器或编写单元测试可以为您解决这个问题。

我认为这样做的目的是看到大量CPU被使用。如果您想要速度,您可以优化这很多,虽然我怀疑埃拉托斯提尼筛在一个线程将更快。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26761736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档