Java 不完全执行其工作的递归任务

Java 不完全执行其工作的递归任务,java,recursion,Java,Recursion,我尝试创建一个递归任务,将一组元素划分为更小的部分,并对它们运行一系列数学运算,比如说数值积分,然后尝试对每个元素使用单独的结果。但似乎在池完全工作之前就发生了错误。我的代码尝试访问尚未处理的元素。 你能帮我做这个吗 public void ComputeStiffnessMatrix(DataScanner DS){ ans=new double [2*(DS.getXarray().length)][2*(DS.getXarray().length)]; int nele

我尝试创建一个递归任务,将一组元素划分为更小的部分,并对它们运行一系列数学运算,比如说数值积分,然后尝试对每个元素使用单独的结果。但似乎在池完全工作之前就发生了错误。我的代码尝试访问尚未处理的元素。 你能帮我做这个吗

public void ComputeStiffnessMatrix(DataScanner DS){

    ans=new double [2*(DS.getXarray().length)][2*(DS.getXarray().length)];

    int nelels=((DS.getNelKsi())*(DS.getNelEta()));

    ArrayList<ElementStiffness> elsm=new ArrayList<>();

    StiffnessMatrix SM=new StiffnessMatrix(elsm,DS,0,(nelels-1));
    ForkJoinPool pool = new ForkJoinPool();
    System.out.println("Stiffness Matrix Computation...");
    long startTime = System.currentTimeMillis();
    pool.invoke(SM);
    long endTime = System.currentTimeMillis();

    System.out.println("Stiffness Matrix Computation took " + (endTime - startTime) +  " milliseconds.");
    System.out.println("Arranging into an array...");
    long startTime2 = System.currentTimeMillis();



    try {
        ArrayList<ElementStiffness> kk=(ArrayList<ElementStiffness>) SM.get();

        for (int el=0;el<nelels;el++){

            ElementStiffness pp=kk.get(el);
            System.out.println("EL NO."+el);
            double vals[][]=pp.getStiffnessMatrix();
            int sup[]=pp.getControlpointsSupport();

            for (int i=0;i<sup.length;i++){
                for (int j=0;j<sup.length;j++){
                    ans[(2*sup[i])+0][(2*sup[j])+0]=ans[(2*sup[i])+0][(2*sup[j])+0]+vals[(2*i)+0][(2*j)+0];
                    ans[(2*sup[i])+0][(2*sup[j])+1]=ans[(2*sup[i])+0][(2*sup[j])+1]+vals[(2*i)+0][(2*j)+1];
                    ans[(2*sup[i])+1][(2*sup[j])+0]=ans[(2*sup[i])+1][(2*sup[j])+0]+vals[(2*i)+1][(2*j)+0];
                    ans[(2*sup[i])+1][(2*sup[j])+1]=ans[(2*sup[i])+1][(2*sup[j])+1]+vals[(2*i)+1][(2*j)+1];
                }
            }
        }


    } catch (InterruptedException | ExecutionException ex) {
        Logger.getLogger(IGATest.class.getName()).log(Level.SEVERE, null, ex);
    }
    long endTime2 = System.currentTimeMillis();

    System.out.println("Stiffness Matrix rearrangement took " + (endTime2 - startTime2) +  " milliseconds.");

    try{
        FileOutputStream fs=new FileOutputStream("stifmat.tmp");
        ObjectOutputStream os=new ObjectOutputStream(fs);
        os.writeObject(ans);
        os.close();
    }catch (IOException e){
        e.printStackTrace();
    }

    ans=null;


}
public void computestiffness矩阵(DataScanner DS){
ans=新的双精度[2*(DS.getXarray().length)][2*(DS.getXarray().length)];
int-nelels=((DS.getNelKsi())*(DS.getNelEta());
ArrayList elsm=新的ArrayList();
Stiffnesmatrix SM=新的Stiffnesmatrix(elsm,DS,0,(nelels-1));
ForkJoinPool池=新的ForkJoinPool();
System.out.println(“刚度矩阵计算…”);
long startTime=System.currentTimeMillis();
调用池(SM);
long-endTime=System.currentTimeMillis();
println(“刚度矩阵计算耗时”+(endTime-startTime)+“毫秒”);
System.out.println(“排列成一个数组…”);
long startTime2=System.currentTimeMillis();
试一试{
ArrayList kk=(ArrayList)SM.get();

对于(int el=0;el也就是说,向我们显示错误,并向我们显示您的
stiffnesmatrix
(嘿嘿)。听起来您不是在正确地等待任务完成,就是没有启动您认为正在启动的所有任务(一些调试打印输出将帮助您确定哪一个是这种情况).@JasonC是的,没错D@JasonC你知道,我应该如何等待任务完成?@JasonC我想做的是确保所有元素都被完全处理。我相信“pool.invoke(SM)”part完全确保了任务的完成。不是吗?是的,你是对的,
invoke
等待任务完成,对不起。因此,也许你没有安排你认为是的所有任务。这就是为什么你真的需要向我们展示
Stiffnesmatrix
的代码;如果你的
ForkJoinTask
实现中有错误,它可能会导致许多问题。
private final int min;
private final int max;
private final DataScanner ds;
ArrayList<ElementStiffness> elsm;

public StiffnessMatrix (ArrayList<ElementStiffness> elsm,DataScanner DS,int min, int max){

    this.ds=DS;
    this.min=min;
    this.max=max;
    this.elsm=elsm;
}



protected void compdir(){

    for (int i=min;i<=max;i++){
        double[] elsp=ds.getElementSpan(i);
        Element el=new Element(ds,((elsp[0]+elsp[1])*0.5),((elsp[2]+elsp[3])*0.5));
        ElementStiffness els=new ElementStiffness(ds,el);
        elsm.add(els);
    }
}

@Override
protected ArrayList <ElementStiffness> compute(){


    int processors = Runtime.getRuntime().availableProcessors();
    if (max-min<processors) {      
        compdir();
    } else {
        int center = min + (max - min) / 2;
        invokeAll(new StiffnessMatrix(elsm,ds, min, center) , new StiffnessMatrix(elsm, ds, center+1, max));

    }     
    return elsm;
}