0

我正在尝试将素数计数器并行化作为练习。我重构了原始代码并将长循环与其他循环分开,以便我可以并行化它们。现在我有以下代码并且多线程看起来很困难,因为我需要跟踪找到的素数(按顺序)并计算找到的素数的数量。

nthPrime(long n) 获取要搜索的素数的数量。返回第 n 个素数。count 是一个 ArryList

public static long nthPrime(long n) {

    count.add((long) 1);
    if (n < 2) {
        count.add((long) 3);
        return getCount();
    }
    count.add((long) 3);
    if (n == 2) {
        return getCount();
    }

    step = 4;
    candidate = 5;
    checker(n, step, candidate);
    return getCount();
}

private static long checker(long n, int step, long candidate) {

    while (count.size() < n) {
        if (Checker.isPrime(candidate)) {
            // checks the number for possible prime
            count.add(candidate);
        }

        step = 6 - step;
        candidate += step;
    }
    return getCount();
}

关于使用 util.concurrent 或线程来并行化的任何想法?

谢谢

4

1 回答 1

0

两条忠告:

  1. 在开始之前,您需要将现有的非并行代码转换为 1) 有效且 2) 可读的代码。尝试以当前形式并行化它会导致失败。

    • 我可以看到错误(我认为)

    • 我看不到您理解基本筛选算法的证据……这就是您在这里尝试实现的。

  2. 任何人都可以将算法拆分为位并使用多个 Java 线程来执行这些位。困难在于提出一个可行的方案,并且你的努力实际上会带来值得的加速。这需要:

    • 对问题和适用算法有很好的理解,

    • 识别适合并行化的问题/算法部分,

    • 了解 Java 多线程的开销和潜在瓶颈,以及

    • 对正确性问题的理解;例如,在何处以及如何同步。

    我无法在 StackOverflow Answer 的空间中给你上一堂课。你需要一本教科书。

于 2013-10-26T03:17:33.570 回答