Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    Problema Sincronizzazione Exchanger

    Salve a tutto il forum! sto avendo qualche problema con questo strumento di sincronizzazione quindi mi sono registrato sperando in qualche dritta
    Il mio problema è : Ho 7 consumatori e 1 produttore,il produttore produce 4 items e fa exchange di tutti e 4, a questo punto 4 consumatori faranno exchange e dopo aver consumato rifaranno exchange.
    La prima domanda è : Ho bisogno di solo 4 exchanger in quanto il produttore comunica con 4 consumatori per volta giusto? L'alternativa sarebbe 7 exchangers ma 3 non mi sembrano necessari..
    La seconda domanda è : Devo andare a creare 4 o 7 variabili Exchanger o è possibile farlo in maniera più compatta ? se fossero stati 50 consumatori e 30 items ,30/50 variabili mi sembrano un pò troppe ad ogni modo ho provato con un array ma Eclipse si incavola dicendo : " Cannot create a generic array of Exchanger<V> "
    help!!

    grazie a tutti anticipatamente

  2. #2
    up? :rollo:

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Per gli excanger, non li ho mai utilizzati, pero' a naso se solo 4 possono essere attivi in uno stesso momento, direi 4. Per la seconda, servirebbe il codice.
    Probabilmente hai fatto una cosa tipo:
    codice:
    public class StrutturaDati<V extends Object> {
       private Exchanger<V>[] data;
    
       public StrutturaDati(int capacità) {
          data = new Exchanger<V>[capacità];
          for(int i=0; i<data.length; i++)
              data[i] = new Exchanger<V>();
          //eccetra
       }
    }
    Che non e' corretto (http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf).
    Prova a mettere
    codice:
    public class StrutturaDati<V extends Object> {
       private Exchanger<V>[] data;
    
       public StrutturaDati(int capacità) {
          data = new Exchanger[capacità];
          for(int i=0; i<data.length; i++)
              data[i] = new Exchanger<V>();
          //eccetra
       }
    }
    Non so se e' il modo giusto di procedere in questi casi, ma almeno dovrebbe funzionare.

  4. #4
    prima di tutto grazie simo per avermi risposto,in realtà avevo scritto Exchanger<Integer>[] ex = new Exchanger<Integer>[capacità];
    tuttavia scrivendo così:
    Exchanger<Integer>[] ex = new Exchanger[capacità]; eclipse dice che non è sicuro,tuttavia sembra funzionare.
    cmq L'exchanger corrisponde ad una send e reiceve fatte in un colpo solo,in pratica è un meccanismo di comunicazione fra soli 2 thread perciò ho il dubbio che pur essendo solo 4 gli oggetti da scambiare fra produttore e consumatori devo avere lo stesso 7 Exchangers,purtroppo nella documentazione sul sito della sun sono poco chiari e non riesco a trovare altri esempi su internet, perciò sarei molto grato se qualcuno potesse trovarmi del materiale o codice che riguarda gli exchangers,grazie a tutti.

  5. #5
    nessuno sa utilizzare l'exchanger ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Ho dato un occhiata e non mi pare che un Exchangere debba sapere chi e' il thread che lo sta utilizzando. Credo che entrambe le soluzioni possano andare bene, ma dipende dal modo in cui implementi il tuo codice. Se in ogni consumatore metti il riferimento ad un Exchanger, allora devi usare 7 Exchanger.

  7. #7
    si,nel costruttore del consumatore naturalmente devo passare l'exchanger perciò ormai sono convinto che debbano esserci 7 exchangers,tuttavia io questi 4 oggetti li ho pensati come un vettore di capacità 4 ma ora non capisco come passare l'oggetto ai vari exchangers mi spiego :
    io ho Exchanger<Integer>[] ex = new Exchanger[7]; int[] oggetto = new int[4];
    l'exchanger scambia fra produttore e consumatore oggetto[i] per tanto ho fatto :

    for(int i = 0 ; i < oggetto.length;i++) {
    oggetto[i]=(int)(Math.random()*4+1);
    oggetto[i] = ex[i].exchange(coppa[i]);
    }

    ma facendo così rimangono 3 exchangers che non fanno nulla. ovviamente scrivendo i<ex.length riceverei ArrayOutOfBoundsException, panico
    p.s. grazie per il tempo che mi stai dedicando

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Ma quello che stai facendo e' un esercizio? Ti dispiace postare il testo cosi' magari capisco meglio e posso darti la mia interpretazione.

  9. #9
    si certo è un esercizio, ecco il testo :

    Al bancone di una gelateria si presentano 7 clienti che intendono assaggiare in successione tutti i gusti di gelato disponibili. A tal fine ricevono dal gelataio una coppa contenente del gelato di un solo gusto alla volta. Ottenuta la coppa, ogni cliente la utilizza per un certo tempo variabile e la restituisce al gelataio. Si hanno in gelateria un numero di coppe pari a 4, per cui il gelataio dopo aver ricevuto indietro tutte le coppe provvede a lavarle e a
    riutilizzarle. Il gelataio tende a servire le coppe ai clienti che finora hanno assaggiato un numero minore di gusti.
    Si simuli lo scenario sopra descritto utilizzando i thread e lo strumento di sincronizzazione Exchanger del package java.util.concurrent.

    grazie

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    Il gelataio tende a servire le coppe ai clienti che finora hanno assaggiato un numero minore di gusti.
    Niente ciclo for perche' serviresti sempre gli stessi, ma devi servire i thread che hanno assaggiato meno gusti. I 3 Exchanger che rimangono inutilizzati ad ogni operazione, immagino svolgano la funzione di wait, quindi saranno bloccati e probabilmente serviti all'iterazione successiva. COme ti ho scritto prima non ho molta esperienza con questa classe. Ho sempre usato le care vecchie wait(), notify() e notifyAll().

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.