Ciao a tutti! Ho scritto un codice e adesso devo farlo girare più volte con parametri diversi! Dato che dovrò fare tanti calcoli ho pensato di scrivere questo codice:
codice:
try{ Stream.PrintTitle(language.getString("START_PARAMETRIC_SIMULATION")); } catch(Exception e){}
Executor = Executors.newFixedThreadPool(3);
//ArrayList<DeterministicSinkSimulation> Deterministic = new ArrayList<>();
double Lengths[] = content.getLength().getDiscreteValues();
double Heights[] = content.getCenterHeight().getDiscreteValues();
double Penetrations[] = content.getPenetration().getDiscreteValues();
double CenterLenghts[] = content.getCenterLongitudinal().getDiscreteValues();
double CenterHeights[] = content.getCenterHeight().getDiscreteValues();
int j = 0;
try{ Stream.PrintSubSubTitleCenter("Pool");} catch(Exception e){}
for (double Length : Lengths) {
for (double Height : Heights) {
for (double Penetration : Penetrations) {
for(double CenterLenght : CenterLenghts){
for (double CenterHeight : CenterHeights) {
DeterministicSinkSimulation D = new DeterministicSinkSimulation();
/* Riempio la classe e mando all'executor*/
Executor.submit(new Calculations(D,j));
//Deterministic.add(D);
if(j==9){
Executor.shutdown();
while(!Executor.isTerminated()){
if(Stop) Executor.shutdownNow();
Executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
}
Executor = Executors.newFixedThreadPool(3);
try{ Stream.PrintSubSubTitleCenter("Pool");} catch(Exception e){}
System.gc();
j=0;
}else{
j++;
}
}
}
}
}
}
Executor.shutdown();
while(!Executor.isTerminated()){
if(Stop) Executor.shutdownNow();
Executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
}
}
e la Classe calculations è fatta così
codice:
private class Calculations implements Runnable{
private DeterministicSinkSimulation DSC;
private final int Index;
public Calculations(DeterministicSinkSimulation DSC, int Index) {
this.DSC = DSC;
this.Index = Index;
}
@Override
public void run() {
if(Thread.currentThread().isInterrupted()) return;
try{
StreamSemaphore.acquire();
try{ Stream.Println(language.getString("STARTING_CALCULUS") + " " + (Index+1), Color.BLUE); } catch(Exception e){}
StreamSemaphore.release();
}catch(Exception e){}
SinkSimulation.SingleCalculation C = new SinkSimulation.SingleCalculation(DSC);
try{
C.Calculate();
DSC.clearUselessData();
DSC.setCalculated(true);
try{Progress.addValue(1);} catch(Exception e){}
WriteFile(DSC);
try{
StreamSemaphore.acquire();
try{ Stream.Println(language.getString("ENDED_CALCULUS") + " " + (Index+1), Color.GREEN); } catch(Exception e){}
StreamSemaphore.release();
}catch(Exception e){}
}catch(Exception e){
Exception = e;
try{
StreamSemaphore.acquire();
try{ Stream.Println(language.getString("ERROR_ON_CALCULUS") + " " + (Index+1) + ": " + e.getMessage(), Color.RED); } catch(Exception ex){}
StreamSemaphore.release();
}catch(Exception ex){}
}
}
private Exception Exception = null;
public Exception getException() {
return Exception;
}
private void WriteFile(DeterministicSinkSimulation SC){
/** Write on file */
}
}
Il problema è che ad un certo punto tutto si ferma e non va più avanti! che problema può essere?
EDIT non c'è un messaggio di errore... a me sembra che il programma mantenga tutto in RAM e quindi ad un certo punto non abbia più ram per fare i conti