21/06/10 20:01
Matteo_SCL
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
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
aaa