|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
[Java] sincronizzazione wait-notify
Ragazzi non riesco proprio a capire perchè non mi funziona il metodo this.notifyAll (); richiamato in setAutorizzazione(); della classe ServizioFondoComune.
dovrebbe sbloccarmi tutti 3D che sono in wait nel primo while, ma questo non succede...dov'è che sbaglio? setAutorizzazione () è richiamato da un metodo che si trova in un 3D Amministratore, che ha lo scopo di permettere il prelievo da una delle due casse del Fondo Comune, in particolare della cassaSecondaria. package server; public class ServizioFondoComune { private int cassaPrincipale; private int cassaSecondaria; private final static int LIMITE_CASSA_SECONDARIA=100000; private boolean autorizzazione=false; public ServizioFondoComune() { //COSTRUTTORE cassaSecondaria=0; cassaPrincipale=0; } public synchronized int getCassaPrincipale (){ return cassaPrincipale; } public synchronized void setCassaPrincipale (int q){ cassaPrincipale=cassaPrincipale+q; System.out.println ("CassaPrincipale= "+cassaPrincipale); } public synchronized int getCassaSecondaria (){ return cassaSecondaria; } public synchronized void setCassaSecondaria (int q){ cassaSecondaria=cassaSecondaria+q; System.out.println ("CassaSecondaria= "+cassaSecondaria); } public synchronized void deposito (int quantità) { //synchronized perchè il deposito deve essere effettuato da un 3D alla volta // se così non fosse, ci sarebbe una condizione di RACE CONDITION if (quantità+getCassaSecondaria()<LIMITE_CASSA_SECONDARIA){ setCassaSecondaria(quantità); if (autorizzazione) this.notifyAll(); //mi sblocca il wait sulla cassa secondaria } else { //supero il limite superiore con un deposito int quantPerRaggiungereLimite=LIMITE_CASSA_SECONDARIA-getCassaSecondaria(); setCassaSecondaria(quantPerRaggiungereLimite); //qui la cassaSecondaria dovrebbe raggiungere 1000 int eccedenzaDaAGGCassaPrincipale=quantità-quantPerRaggiungereLimite; setCassaPrincipale(eccedenzaDaAGGCassaPrincipale); } } public synchronized void prelievo (int quantità) { if (getCassaPrincipale()-quantità>=0){ //prelievo normale System.out.println ("Prelievo dalla cassa Principale..."); setCassaPrincipale(-(quantità)); } else { //vuol dire che la cassaPrincipale si svuota e devo ricorrere alla cassaSecondaria int prelevareDaCassaSecondaria=quantità-getCassaPrincipale(); setCassaPrincipale(-getCassaPrincipale()); //pone a 0 la cassa principale System.out.println ("Prelievo dalla cassa Secondaria..."); while (getAutorizzazione()==false){ //l'amministatore non da il permesso di Prelevare dalla cassa Secondaria //Ora devo prelevare dalla cassaSecondaria previa autorizzazione dell'amministratore try { System.out.println ("wait AUTORIZZAZIONE..."); this.wait (); //aspetta che il System.out.println ("DOPO IL WAIT dell'AUTORIZZAZIONE il notify funziona!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //fine while System.out.println ("SUPERO IL PRIMO WHILE!!!..."); while (getCassaSecondaria()-prelevareDaCassaSecondaria<0){ try { System.out.println ("wait PRELIEVO..."); this.wait(); System.out.println ("DOPO IL WAIT del PRELIEVO il notify funziona!"); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //fine while //System.out.println ("DOPO IL WAIT il notify funziona!"); // setCassaSecondaria(-(prelevareDaCassaSecondaria)); } } public synchronized void setAutorizzazione(boolean b) { // TODO Auto-generated method stub autorizzazione=b; notifyAll(); //non notifica un cazzo? PERKééééééééééééééééééééééééééééé System.out.println ("Stato AUTORIZZAZIONE----->"+autorizzazione); System.out.println ("HO FATTO IL NOTIFYYYY"); } public boolean getAutorizzazione (){ System.out.println ("Stato AUTORIZZAZIONE in get----->"+autorizzazione); return autorizzazione; } } Amministratore invece l'ho implementata così: package server; import java.util.Random; public class Amministratore extends Thread{ ServizioFondoComune sFC=null; public Amministratore (ServizioFondoComune servizio){ sFC=servizio; } public void autorizza () { System.out.println ("AUTORIZZAZIONE EFFETTUATA"); sFC.setAutorizzazione (true); } public void run (){ Random r=new Random(); System.out.println ("Avvio del conteggio della generica richiesta dell'Amministratore"); int sec=0; try { //sec=r.nextInt(11)*1000; //da 0 a 10 secondi ( da 0 a 10000 millisecondi) // sleep (sec); sleep (5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } this.autorizza(); } } |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Mar 2006
Città: Napoli
Messaggi: 170
|
ho risolto,
creavo due istanze diverse della classe ServizioFondoComune in un Server Main per quello i notify non funzionavano, si riferivano a oggetti diversi... potete anche chiudere o eliminare. Grazie |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:33.



















