背景:我正在逃跑的恐慌,人們從房間逃離如何,建築物走廊等的模擬對於大量人口有大量的計算,因爲每個人需要(2000人= 2000^2計算)的Java 7 ForkJoin凍結當它有叉
代碼:我試圖實現一個fork連接機制來拆分這個計算。 「人」是類「行人」的數組列表。我模擬的每個人都是這個班的一個實例。這是我實現的frok功能/加入:
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。我增加了堆棧大小,然後程序凍結而不響應。
我已經玩了幾天,但沒有得到任何地方。如果有人有一個想法,我將不勝感激
什麼操作系統,你運行這個嗎?很多時候,操作系統對分叉進程的數量有限制。 – muruga
我正在運行Windows 7,64位。我試圖讓這個301人運行,所以它應該只是分叉一次 –