Lelex82
19-02-2012, 14:35
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();
}
}
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();
}
}