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:
e la Classe calculations è fatta così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); } }
Il problema è che ad un certo punto tutto si ferma e non va più avanti! che problema può essere?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 */ } }
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

Rispondi quotando
