背景:私は脱出パニックのシミュレーションを実行しています。人々が部屋や建物の廊下などからどのように脱出するかです。人口が多い場合、各人がお互いから「社会的力」を計算する必要があるため (つまり、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 をスローします。スタック サイズを増やしたところ、プログラムがフリーズして応答しなくなりました。
私はこれを数日間いじってみましたが、どこにも行けません。誰かがアイデアを持っているなら、私はそれを感謝します