2012-11-27 31 views
1

背景:我正在逃跑的恐慌,人們從房間逃離如何,建築物走廊等的模擬對於大量人口有大量的計算,因爲每個人需要(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。我增加了堆棧大小,然後程序凍結而不響應。

我已經玩了幾天,但沒有得到任何地方。如果有人有一個想法,我將不勝感激

+0

什麼操作系統,你運行這個嗎?很多時候,操作系統對分叉進程的數量有限制。 – muruga

+0

我正在運行Windows 7,64位。我試圖讓這個301人運行,所以它應該只是分叉一次 –

回答

1

你錯誤地分裂你的工作RecursiveAction

RecursiveAction作品一長度mLengthpeople片,它不應該叫people.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)); 
} 
+0

謝謝!現在你說這似乎很明顯。抱歉無用的問題 –