Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [JAVA] Help thread! Rimane in wait() dopo notifyAll()

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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Spostato nel forum dedicato al linguaggio Java.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3

    Re: Moderazione

    Originariamente inviato da LeleFT
    Spostato nel forum dedicato al linguaggio Java.


    Ciao.
    Grazie, scusami se ho sbagliato sezione.



    per la cronaca, se nel metodo eroga metto wait(1000) funziona tutto -.-'
    perchè non si sveglia se metto solo wait() e poi chiamo notifyAll nel metodo deposita?


    questa è la console dell'esecuzione

    nuovo deposita: mi sto per fermare
    nuovo_eroga: mi sto per fermare
    nuovo: sveglio tutti
    nuovo deposita:sono ripartito
    deposita: sveglio tutti

  4. #4
    mi sa che ho capito l’errore ma non so come risolverlo –.-‘
    il problema è che notifyAll() non risveglia tutti i thread ma risveglia i thread in attesa su quella variabile. Quindi il problema credo sia che controllo gestione estende controllo deposito, ecco perchè viene risvegliato, mentre controllo erogazione è sottoclasse di un altro controllore. Deve essere qualcosa del genere. Come faccio a far si che vadano in wait sulla stessa variabile?

  5. #5
    non sincronizzare i metodi ma prova a sincronizzare gli oggetti che utilizzi all'interno dei metodi..
    sorry ma ho dato uno sguardo veloce veloce
    SCJP 96%

    Sono io signore che non ti perdono,io non merito punizioni, io sono potentissimo e ora che ho visto il tuo volto merito di stare in un cielo alto più alto del tuo perché non capendo chi è l’uomo hai dimostrato di essermi inferiore,tu servirai me. Da oggi mi chiamerò Satan che significa l’Avversario.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.