Java 7 ForkJoin 在必须 fork 时卡住

标签 java java-7 fork-join

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

代码:我尝试实现一个 fork 连接机制来拆分此计算。 “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。我增加了堆栈大小,然后程序就卡住了并且没有响应。

我已经玩了几天了,但没有任何进展。如果有人有想法,我将不胜感激

最佳答案

您错误地拆分了 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));
}

关于Java 7 ForkJoin 在必须 fork 时卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586784/

相关文章:

java - 使用apache poi如何读取特定的Excel行和列

java - Android:GridView 在 getView 中重置位置

java - 如何使用 MS Exchange 服务器发送电子邮件

netbeans - 切换到 JDK 7 后构建 EAR 时抛出异常

java - 有关即将推出的 fork-join 框架的资源

java - 如何确定一个字符串是否是 Java 中有效的 Java 表达式?

Eclipse:jdk7 错误

java - 在 Java 中从 List 中提取 Map 的最短方法

java - 如何在Java中设置Fork/Join算法的阈值?

java - 为什么这个简单的 java fork 加入池不起作用?