Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34

    [JAVA] Lavorare sullo stesso oggetto in thread diversi

    Salve a tutti ed auguri posticipati di Natale.
    Come da titolo avrei un problema che mi attanaglia: come faccio a lavorare sullo stesso oggetto in thread diversi (sincronizzati) dello stesso package?
    Avendo una coda dovrei da una parte accodare, dall'altra implementare un'attesa e deaccodare.
    Ringrazio chiunque, di buon cuore, risponda.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Lavorare sullo stesso oggetto in thread diversi

    Originariamente inviato da vi1985
    Avendo una coda dovrei da una parte accodare, dall'altra implementare un'attesa e deaccodare.
    Se ti va bene una coda con un limite massimo nella lunghezza (bounded), allora usa la classe java.util.concurrent.ArrayBlockingQueue.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34
    Come struttura di dati ho usato una LinkedList.
    Ho passato questa coda nel costruttore del Thread, fatto in questo modo:

    codice:
    public class MioThread implements Runnable{
    	
    	private ElencoPersone coda;
    
    	public SportelloThread(coda){
    	this.coda = coda;
    }
    
    	public void run(){	
    	while(coda.getStato()){
    	try{
            coda.wait();
    }catch(InterruptExcpetion e){
    	// deaccoda
    }
    }
    }
    dove ElencoPersone è:

    codice:
    public class ElencoPersone {
    	
    
    	
    	public ElencoPersone(boolean stato){
    		this.stato = stato;
    	}
    	
    	private LinkedList<Persona> coda;
    	private boolean stato;
    	
    	public void aggiungi(Persona p){
    		if(stato == true)
    			coda.add(cliente);
    	}
    	
    	public synchronized Cliente rimuovi() throws Exc{
    		if(coda.isEmpty())
    			throw new Exc;
    		return coda.remove();
    	}
    	
    	public void setStato(boolean stato){
    		this.stato = stato;
    	}
    	
    	public boolean getStato(){
    		return stato;
    	}
    }
    Ora il problema è un altro.
    Non avendo mai avuto modo di affrontare questo tipo di problema, la condizione da verificare nel run del thread da cosa deve dipendere?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Ciò che hai scritto non mi sembra né valido né thread-safe. Io ti ho suggerito ArrayBlockingQueue perché è fatta apposta per queste cose: è una coda, è thread-safe e alcuni suoi metodi sono "bloccanti".
    Se vuoi fare una cosa del genere solamente con LinkedList è fattibile ma il tutto va gestito con criterio e in modo opportuno.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di vi1985
    Registrato dal
    Dec 2006
    Messaggi
    34
    Il problema che mi preme è un altro.
    Anche usando la ArrayBlockingQueue (che sto vedendo dalla documentazione) come faccio a lavorare con essa su thread separati?
    Devo comunque andare a creare una nuova classe di Thread nel quale effettuare le operazioni che desidero, anche perché è essenziale la gestire la sincronizzazione.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da vi1985
    Anche usando la ArrayBlockingQueue (che sto vedendo dalla documentazione) come faccio a lavorare con essa su thread separati?
    I thread devi crearli e gestirli tu!
    L'unica cosa certa è che ArrayBlockingQueue è thread-safe, cioè vuol dire che è utilizzabile in modo "sicuro" da più thread. Tutto qua.

    Una cosa è la gestione dei thread, un'altra è la implementazione di una classe che sia thread-safe, requisito fondamentale affinché uno stesso oggetto di questa classe possa essere usato in modo sicuro da più thread.

    Volendo farlo con LinkedList, ecco:

    codice:
    class ElencoPersone
    {
        private LinkedList<Persona> coda;
    
        public ElencoPersone ()
        {
            coda = new LinkedList<Persona> ();
        }
        
        public synchronized void inserisci (Persona p)
        {
            coda.add (p);
            notifyAll ();
        }
    
        public synchronized Persona estrai ()
            throws InterruptedException
        {
            while (coda.isEmpty ())
                wait ();
    
            return coda.remove ();
        }
    }
    Nota come entrambi i metodi siano synchronized e nota come in estrai() ci sia la "logica" di blocking (se si vuol farlo blocking ovviamente .... non è obbligatorio, si potrebbe anche lanciare una eccezione).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Scusa il main dov'è ??? Per poter provare questa coda bloccante ...

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da rosario.russo71
    Scusa il main dov'è ???
    La classe ElencoPersone che avevo postato rappresentava solo una lista di oggetti Persona ... basta ... tutto qui.
    Non c'è un main() in quella classe ... perché è solo una "collezione".
    Vuoi provarla? Definisci un'altra classe che ha il main, istanzia un ElencoPersone, ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ok, fatto grazie...

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.