Originariamente inviato da Donovant
A parte il fatto di mettere il "wait()" in un blocco try{...}catch(){...}, ma nel:
codice:
synchronized (this) {
banca.operazione(modifica);
while (sospendi) {
wait();
}
}
"sospendi" è false, e non diventerà mai "true" (non vorrei dire cagate), perchè dal metodo "run" della classe Runnable non vai a leggere la variabile (privata) "sospendi"...
ma portesti mettere in "wait", direttamente nel metodo "operazione(int s)"
codice:
synchronized public void operazione(int s) {
if (saldo + s < 0) {
System.out.println("Impossibile effettuare l'addebito " + s);
try{ wait(); }catch( InterruptedException ie ){}//qui puoi lasciare vuoto
} else {
saldo += s;
System.out.println("Modifica di " + s + " effettuata, Il tuo saldo è: " + saldo);
try {
Thread.sleep(2000);
} catch (Exception e) {
System.out.println("Errore " + e.getMessage());
}
}
}
In questo modo si blocca come vorresti tu, ma poi il programma va in blocco, deadlock, chiamalo come vuoi e resterà in quella condizione, a meno che ci sia qualche altro "oggetto" che lo risveglierà, attenzione però, il risveglio non può essere mirato, certo che se hai solo una oggetto Banca2 in blocco puoi usare notify();, ma se ce ne sono di più per la programmazione concorrenziale dovresti usare notifyAll(); e verificare con un "while", chi deve o meno rientrare nello stato di blocco.
Spero di essere stato chiaro e di aver capito quello che ti serviva