[英]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
适用于长度为mLength
的people
,它根本不应该调用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.