繁体   English   中英

Java 7 ForkJoin必须分叉时冻结

[英]Java 7 ForkJoin freezes when it has to fork

背景:我正在模拟逃生恐慌,人们如何逃离房间,建筑物走廊等。对于大量人口,每个人需要计算彼此(例如2000人)的“社会力量”,因此需要进行大量计算= 2000 ^ 2个计算)

代码:我尝试实现一个fork联接机制来拆分此计算。 “人”是“行人”类的数组列表。 模拟中的每个人都是此类的一个实例。 这是我实现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。 我增加了堆栈大小,然后该程序冻结,并且没有响应。

我已经玩了几天,但是什么都做不了。 如果有人有想法,我将不胜感激

您在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));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM