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;
}