PDA

View Full Version : [JAVA] Problema lettori e scrittori


zanardi84
30-05-2013, 17:19
Ho implementato il problema dei lettori e degli scrittori, ma non so se è corretto.

public class Contatore
{
private int residuo;
final int limite = 10000;

public Contatore(int residuo)
{
this.residuo = residuo;
}

public synchronized void aggiungi(int valore)
{

// se il residuo è uguale al limite o se la somma la supera non si può aggiungere e il processo che esegue
// il metodo si mette in attesa che un prelievo effettuato da
// un altro processo, segnalato con notify(), riporti entro i valori.
if(residuo == limite || ((residuo + valore) > limite))
{
try
{
wait();
}
catch(InterruptedException e){}
}
else
{
residuo = residuo + valore;
System.out.println("Dopo deposito: "+residuo);
notify();
}
}

public synchronized void preleva(int valore)
{
// se il residuo è pari a 0 o se il valore è minore del residuo non si può prelevare
// e il processo che invoca si pone in attesa con wait() che ci sia un deposito da parte
// di un altro processo che deve segnalare l'operazione con notify().

if(residuo == 0 || valore > residuo)
{
try
{
wait();
}
catch(InterruptedException e){}
}
else
{
residuo = residuo - valore;
System.out.println("Dopo prelievo: "+residuo);
notify();

}
}
}


public class Estrazione implements Runnable
{

private int valore;
private Contatore c;
public Estrazione(Contatore c, int valore)
{
this.c=c;
this.valore = valore;
}

@Override
public void run()
{
// TODO Auto-generated method stub
c.preleva(valore);
}

}


public class Main
{

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
Contatore c = new Contatore(20);
Estrazione e = new Estrazione(c, 24);
Deposito d = new Deposito(c, 500);
Thread dep = new Thread(d);
Thread est = new Thread(e);
est.start();
dep.start();
}

}


L'esecuzione restituisce questo: Dopo deposito: 520.

Vorrei che facesse questo:
il thread di prelievo non trova le condizioni e si mette in attesa.
Allora si mette in azione il thread di deposito che trova le condizioni e lancia la notify sul thread di prelievo. Con una combinazione particolare tra i valori trovo un deadlock perchè i processi sono in attesa l'uno dell'altro.

Nel mio caso non succede. La domanda è: perchè? Perchè manca l'implementazione del catch o c'è dell'altro?

Nel main come posso ottenere il dato aggiornato di c?

starfred
02-06-2013, 20:46
Ciao il problema è decisamente semplice ma infame :D , il thread del prelievo funziona correttamente tuttavia esso è entrato dentro la condizione "if" quindi una volta sbloccato non esegue l'else :sofico: :sofico: :sofico: