Vi prego, nessuno riesce ad aiutarmi a risolvere questo problema, spero che voi ce la facciate devo consegnare il progetto domani
Devo implementare i thread sull'applicazione già esistente. Devo creare un thread che crea un nuovo prodotto, uno che deposita e uno che eroga. Quello che deposita deve avanzare condizionatamente alla creazione del nuovo prodotto, e quello che eroga deve avanzare condizionatamente all'avvenuto deposito.
Ho creato i 3 thread che lancio con un apposito pulsante. Sotto incollo i metodi che ho sincronizzato. Quando i thread eroga e deposita si accorgono che il prodotto non esiste ancora vanno in wait(), il prodotto viene creato, ma quando viene eseguita notifyAll() si sveglia solamente il thread deposita, e l'altro resta su wait(). Aiuto!!
codice:public synchronized void nuovoProdotto(String classeAlimento, IDEsterno k) throws DirittiException, ClasseAlimentareException, ProdottoException, IDEsternoException { if (CostantiClassiAlimentari.containsClasseAlimentareFinale (classeAlimento)) { Portata p; //Da modificare al piu presto if (classeAlimento.equals(CostantiClassiAlimentari.Acqua)) p = new Acqua(k); else if (classeAlimento.equals(CostantiClassiAlimentari.BriccoFrutta)) p = new BriccoFrutta(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Carne)) p = new Carne(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Dolce)) p = new Dolce(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Frutta)) p = new Frutta(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Pesce)) p = new Pesce(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Primo)) p = new Primo(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Soda)) p = new Soda(k); else if (classeAlimento.equals(CostantiClassiAlimentari.Vino)) p = new Vino(k); else p = new Altro(k); mappaProdotti.put(p, k.toString()); System.out.println("nuovo: sveglio tutti"); notifyAll(); } else throw new ClasseAlimentareException("\nClasse alimentare " + classeAlimento + " errata. "); }
codice:public synchronized void eroga(IDEsterno k, int quantita) throws DirittiException, ProdottoException, IDEsternoException, QuantitaException, GiacenzaInsufficienteException, InterruptedException { if (k==null) { throw new IDEsternoException("L/identificatore non deve essere nullo\n"); } while (mappaProdotti.get(k.toString())==null) { System.out.println("nuovo_eroga: mi sto per fermare"); wait(); System.out.println("nuovo_eroga: mi sono svegliato"); } if (mappaProdotti.get(k.toString())==null) { System.out.println("eroga: sono prima dell'ecc"); throw new ProdottoException("Prodotti " + k.toString() + " non sono presenti\n"); } if (quantita <=0) { throw new QuantitaException ("La quantita da erogare deve essere positiva\n"); } // if (quantita > mappaProdotti.get(k.toString()).giacenza()) { // throw new GiacenzaInsufficienteException ("Il disponibile di " + k.toString() + " (" + giacenza(k) + ")" + " è insufficiente (" + quantita +")\n"); // } while(giacenza(k)<=0){ System.out.println("eroga:giacenza 0: giacenza 0 mi sto per addormentare"); wait(); System.out.println("eroga:giacenza 0: mi sono svegliato"); } System.out.println("eroga: sto per erogare"); mappaProdotti.get(k.toString()).eroga(quantita); }codice:public synchronized void deposita(IDEsterno k, int quantita) throws DirittiException, ProdottoException, IDEsternoException, QuantitaException, InterruptedException { if (k==null) { throw new IDEsternoException("L'identificatore del prodotto deve essere non nullo"); } if (mappaProdotti.get(k.toString())==null) { System.out.println("nuovo deposita: mi sto per fermare"); wait(); System.out.println("nuovo deposita:sono ripartito"); } if (mappaProdotti.get(k.toString())==null) { System.out.println("deposita: sto per lanciare l'ecc"); throw new ProdottoException("Prodotti " + k.toString() + " non sono presenti"); } else { if (quantita <=0) { throw new QuantitaException ("La quantita da depositare deve essere positiva\n"); } else mappaProdotti.get(k.toString()).deposita(quantita); System.out.println("deposita: sveglio tutti"); notifyAll(); } }


Rispondi quotando

