Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - Molecola d'acqua Java- aiutatemi a trovare l'errore!! Please
Forum - Java - Molecola d'acqua Java- aiutatemi a trovare l'errore!! Please

Avatar
Matteo_SCL (Normal User)
Newbie


Messaggi: 1
Iscritto: 21/06/2010

Segnala al moderatore
Postato alle 22:01
Lunedì, 21/06/2010
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

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 19:04
Martedì, 22/06/2010

Praticamente quando la molecola è completata, incrementa il contatore molecola,
e azzera tutto, ma se (O) è stato messo in attesa non dovrebbe azzerare anche (O),
quindi incrementa molecola e fai proseguire il ciclo .....


If ok Then GOTO Avanza else GOTO Inizia

PM Quote