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();
		}
	}