Le code bloccanti: BlockingQueue – Lezione 43 di Java Avanzato

L’interfaccia BlockingQueue sottoclasse di Queue

L’interfaccia Queue rappresenta una generica coda, non necessariamente bloccante. Eredita da Collection molti metodi a cui aggiungere il metodo peek (da sbirciare) che restituisce il primo elemento contenuto nella coda (la coda non viene modificata).
Queue viene estesa da BlockingQueue, questa classe rappresenta una generica coda bloccante in cui le operazioni avvengono in maniera sicura. Di BlockingQueue vengono fornite diverse implementazioni come ArrayBlockingQueue e ListBlockingQueue.

 
 Graficamente BlockingQueue è così definita (cliccare sull’immagine per ingrandirla):

La classe Queue di Collection

BlockingQueue offre dei metodi per inserire e rimuovere gli elementi all’interno della coda, rispettivamente questi metodi si bloccano se la coda risulta piena o vuota. In questo modo i programmi che utilizzano questa struttura dati sono sincronizzati grazie ai mutex e condition variable. I metodi offerti da BlockingQueue sono:

  •   public void put(E elem) throws InterruptedException

    Il metodo put inserisce l’oggetto elem alla fine della coda, se la coda è piena si blocca mettendo il thread corrente in attesa finché non viene rimosso un elemento dalla coda;

  •   public E take() throws InterruptedException

    Il metodo take restituisce l’elemento in cima alla coda, se la coda è vuota mette in attesa il thread corrente finché non viene inserito un nuovo elemento.

ArrayBlockingQueue e ListBlockingQueue

ArrayBlockingQueue è realizzata internamente come un array circolare, estendendo BlockingQueue fornisce un array di tipo bloccante. Un ArrayBlockingQueue ha una capacità fissa e non ridimensionabile fornita tramite il suo costruttore:

  public ArrayBlockingQueue(int capacity){
    // ...
  }

Una ListBlockingQueue ha capacità potenzialmente illimitata, per cui non risulterà mai piena. Di conseguenza il metodo put non si potrà mai bloccare non potrà mai esserci una sua violazione del suo contratto.

Entrambe le classi sono Thread Safe, a differenza delle altre classi di Collection: ArrayBlockingQueue e ListBlockingQueue sono state realizzate appositamente per lavorare con i thread, garantiscono l’accesso concorrente da parte di più thread.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Collezioni, Guide, Java, Programmazione Taggato con: , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*