【问题标题】:multithreading to calculate primes java多线程计算素数java
【发布时间】:2013-10-26 02:18:27
【问题描述】:

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

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 或线程来并行化的任何想法?

谢谢

【问题讨论】:

  • 将我的multi-threading Sieve of Eratosthenes 从 C# 转换为 Java,将使工作程序达到合理的范围(在几个小时内达到 10^14)。诀窍是不要让多线程变得太细粒度,而是做(在那里)粗略的多线程,在这种情况下,每个线程的页面段。您的问题是您需要素数列表和计数,这意味着枚举素数,这意味着枚举它们的时间将比消除复合物的优化时间长得多。

标签: java multithreading java.util.concurrent


【解决方案1】:

两条建议:

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

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

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

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

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

    • 确定适合并行化的问题/算法部分,

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

    • 理解正确性问题;例如同步的位置和方式。

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

【讨论】:

  • 完整算法在 Checker.isPrime(candidate) 方法中。我已经对其进行了重构,以便代码更易于阅读。检查器方法中的循环是我想要并行化的。
  • @PramudithaNiroshanRanasinghe - 我的答案仍然有效。
  • 是的,我在澄清代码中缺少算法。谢谢
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2015-07-02
  • 2015-07-05
  • 2012-10-09
  • 2014-04-28
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多