Ciao a tutti mi sono imbattuto in questo sito per caso e lo trovo molto interessante, sono disperato per ora perchè ho una tesina in java da consegnare e sono fermo ancora ad un problema che non riesco a risolvere. Vi spiego brevemente...
Allora riguarda un programma di simulazione di sincronizzazione tra processi magari riesce ad individuare subito l'errore, allora ho un generatore di processi che fa nascere in random processi H o O, si deve formare una molecola d'acqua... il codice funzione cosi... nasce H... nasce O... nasce O (va in attesa) nasce H... OK MOLECOLA D'ACQUA FORMATA e incremento il contatore molecola d'acqua di uno. cosa succede però che l'atomo di O rimasto in attesa lo perdo e non lo posso riutilizzare. Non so perchè ma mi sono bloccato E SE NON AZZERO I CONTATORI ALLA FINE MI METTE TUTTO IN ATTESA. LA CLASSE IMPORTANTE E' QUESTA, LA CLASSE CONTROL.
// la classe control e' il monitor, implementa i metodi synchronized
public class Control {
int numeroMolecole=0; // numero di molecole H2O create
int numeroH=0; // numero di atomi di H
int numeroO=0; // numero di atomi di O
public Control(){}
// il metodo CONTROLLA verifica lo stato degli atomi:
public synchronized void controlla(Atomo a) {
System.out.println("l'atomo numero "+ a.getNum()+" di tipo "+a.getTipo()+" entra nel metodo controlla...\n");
// Se il numero di atomi H e' gia'_ 2 e ce n'e' un altro in arrivo..pone quest ultimo in attesa
// O se il numero di atomi di O e' diverso da 0 (c'e' gia'_ un atomo di O) e quello in arrivo e' ancora O,
// viene quest ultimo messo in attesa.
while(((numeroH==2) && (a.getTipo()==1))||((numeroO!=0) && (a.getTipo()==0)) ){
try{
System.out.printf("mette in attesa l'atomo numero %d\n", a.getNum());
wait();
}catch (InterruptedException e) {}
}
// se il numero di H è minore di 2 e l'atomo in arrivo e' H, allora incrementa il numero attuale di H
if ((numeroH<2) && (a.getTipo()==1)) {
numeroH++;
System.out.printf("L'atomo numero %d incrementa numero di atomi di H. \n", a.getNum());
}
// Se il numero di O è nullo e ce n'è in arrivo uno lo prende ed incrementa il contatore numeroO
else if((numeroO==0) && (a.getTipo()==0)){
numeroO++;
System.out.printf("L'atomo numero %d incrementa numero di atomi di O. \n", a.getNum());
}
// Se si raggiunge il numero esatto di atomi di H e atomi di O, allora vengono azzerati i contatori dei rispettivi atomi
// e viene incrementato il contatore delle molecole H2O
if(numeroH==2 && numeroO==1){
numeroMolecole++;
numeroH=0; // AZZERO <-----------
numeroO=0;
System.out.printf("L'atomo numero %d incrementa molecola H2O e rilascia le risorse!\n", a.getNum());
System.out.printf("Numero totale di molecole H2O: %d\nNumero atomi di H: %d\nNumero atomi di O:%d\n", numeroMolecole, numeroH,numeroO);
notifyAll();
}
}// fine metodo controlla(Atomo a)
}// fine classe Control
|