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 または threading を使用するアイデアはありますか?

ありがとう

4

1 に答える 1

0

2 つのアドバイス:

  1. 開始する前に、既存の非並列コードを 1) 機能し、2) 読み取り可能なものに変換する必要があります。現在の形式で並列化しようとすると失敗します。

    • バグが見える(と思う)

    • 基本的なふるい分けアルゴリズムを理解しているという証拠は見当たりません...これは、ここで実装しようとしているようです。

  2. 誰でもアルゴリズムをビットに分割し、複数の Java スレッドを使用してビットを実行できます。困難なのは、機能するスキームを考え出すことであり、あなたの努力が実際に価値のあるスピードアップをもたらす場所です. それには以下が必要です:

    • 問題と適用可能なアルゴリズムの十分な理解、

    • 並列化に適した問題/アルゴリズムの部分を特定し、

    • Java マルチスレッドのオーバーヘッドと潜在的なボトルネックの理解、および

    • 正確性の問題の理解; たとえば、どこでどのように同期するか。

    StackOverflow Answer のスペースでこれらのことについてのレッスンを提供することはできません。テキストブックが必要です。

于 2013-10-26T03:17:33.570 に答える