Salve a tutti, vi spiego brevemente il mio problema e vi posto il codice. 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, quando effettuo la notifyAll i contatori degli atomi si azzerano. vi posto il codice......
// 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;
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