1

背景:私は脱出パニックのシミュレーションを実行しています。人々が部屋や建物の廊下などからどのように脱出するかです。人口が多い場合、各人がお互いから「社会的力」を計算する必要があるため (つまり、2000 人)、大量の計算が必要になります。 = 2000^2 計算)

コード:この計算を分割するために fork join メカニズムを実装しようとしました。"people" はクラス "Pedestrian" の配列リストです。シミュレーションの各人物は、このクラスのインスタンスです。これは、frok/join を実装した関数です。

public static void timeSteppBridgeAllMulti() {
    counterIteration++;
    MultiThreading mt = new MultiThreading(0, people.size());
    ForkJoinPool pool = new ForkJoinPool();
    pool.invoke(mt);

}

static class MultiThreading extends RecursiveAction {

    int mStart = 0;
    int mLength = 0;

    MultiThreading(int start, int length) {
        mStart = start;
        mLength = length;
    }

    protected void computeDirectly() {
        for (int i = mStart; i < mStart + mLength; i++) {
            people.get(i).timeStepBridge();
        }
    }

    @Override
    protected void compute() {
        if (people.size() <= 300) {//do work directly
            computeDirectly();
            return;
        }

        int split = people.size() / 2;
        invokeAll(new MultiThreading(mStart, split), new MultiThreading(mStart + split, people.size()));
    }
}

人 (people.get(i)) ごとに、timeStepBridge 関数を呼び出します。この関数は、他のすべての人をループし、位置を読み取り、距離と力を計算します。

問題:人数がしきい値 (ここでは 300) 未満の場合、プログラムは問題なく実行されます。ただし、人数がしきい値を超えると、プログラムは java.lang.StackOverflowError をスローします。スタック サイズを増やしたところ、プログラムがフリーズして応答しなくなりました。

私はこれを数日間いじってみましたが、どこにも行けません。誰かがアイデアを持っているなら、私はそれを感謝します

4

1 に答える 1

1

で作業を誤って分割しましたRecursiveAction

長さのRecursiveActionスライスで動作しますが、まったく呼び出してはいけません:peoplemLengthpeople.size()

@Override
protected void compute() {
    if (mLength <= 300) {//do work directly
        computeDirectly();
        return;
    }

    int split = mLength / 2;
    invokeAll(
        new MultiThreading(mStart, split), 
        new MultiThreading(mStart + split, mLength - split));
}
于 2012-11-27T15:22:19.970 に答える