English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Java Controllo dei flussi

Java Array (matrice)

Java Orientato agli oggetti (I)

Java Orientato agli oggetti (II)

Java Orientato agli oggetti (III)

Java 異常處理

Java List (elenco)

Java Queue (coda)

Java Map collection

Java Set collection

Java Input/Output (I/O)

Java Reader/Writer

Altri argomenti Java

Java LinkedBlockingQueue

In questo tutorial, esploreremo l'uso della classe LinkedBLockingQueue e dei suoi metodi con l'aiuto di esempi.

La classe LinkedBlockingQueue del framework Java Collections utilizza una coda bloccata fornita da una lista.

Ha implementatoInterfaccia BlockingQueue Java.

Creazione di LinkedBlockingQueue

Per creare una coda bloccata a elenco, dobbiamo importare il pacchetto java.util.concurrent.LinkedBlockingQueue.

Ecco come creiamo una coda bloccata a elenco in Java:

1. Senza capacità iniziale

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>();

In questo caso, la capacità iniziale predefinita è 2 31 -1.

2. Con capacità iniziale

LinkedBlockingQueue<Type> animal = new LinkedBlockingQueue<>(int capacity);

Ecco

  • Type - Tipo della coda bloccata a elenco

  • capacity - Dimensione della coda bloccata a elenco

Ad esempio,

//Creazione di LinkedBlockingQueue di stringhe di dimensione 5
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
//Creazione di LinkedBlockingQueue di interi di dimensione 5
LinkedBlockingQueue<Integer> age = new LinkedBlockingQueue<>(5);

Attenzione:Non è necessario fornire la dimensione della coda.

Metodi di LinkedBlockingQueue

La classe LinkedBlockingQueue fornisceInterfaccia di BlockingQueueImplementazione di tutti i metodi.

Questi metodi servono a inserire, accedere e rimuovere elementi dalla coda bloccata a elenco.

Inoltre, impareremo due metodi put(), take(), che supportano operazioni bloccate nella coda bloccata a elenco.

Questi metodi distinguono la coda bloccata a elenco da altre code tipiche.

Inserimento degli elementi

  • add() - Inserisce l'elemento specificato nella coda bloccata a elenco. Se la coda è piena, lancia un'eccezione.

  • offer() - Inserisce l'elemento specificato nella coda bloccata a elenco. Se la coda è piena, restituisce false.

Ad esempio,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        // 使用 add()
        animals.add("Dog");
        animals.add("Cat");
        // 使用 offer()
        animals.offer("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
    }
}

Risultato dell'output

LinkedBlockingQueue: [Dog, Cat, Horse]

Accesso agli elementi

  • peek() - Restituisce un elemento dalla testa della coda bloccata a elenco. Se la coda è vuota, restituisce null.

  • iterator() - Restituisce un oggetto iteratore per accedere in ordine agli elementi della coda bloccata a elenco. Se la coda è vuota, viene lanciata un'eccezione. Dobbiamo importare il pacchetto java.util.Iterator per utilizzarlo.

Ad esempio,

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        //添加元素
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        // 使用 peek()
        String element = animals.peek();
        System.out.println("Accedi all'elemento: " + element);
        // Utilizza iterator()
        Iterator<String> iterate = animals.iterator();
        System.out.print("Elementi della LinkedBlockingQueue ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Risultato dell'output

LinkedBlockingQueue: [Dog, Cat, Horse]
Accedi all'elemento: Dog
Elementi della LinkedBlockingQueue: Dog, Cat, Horse,

Elimina l'elemento

  • remove() - Restituisce e elimina l'elemento specificato dalla coda bloccata a lista. Se la coda è vuota, lancia un'eccezione.

  • poll() - Restituisce e elimina l'elemento specificato dalla coda bloccata a lista. Se la coda è vuota, restituisce null.

  • clear() - Elimina tutti gli elementi dalla coda bloccata a lista.

Ad esempio,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue " + animals);
        // 使用 remove()
        String element1 = animals.remove();
        System.out.println("删除元素:");
        System.out.println("使用 remove(): " + element1);
        // 使用 poll()
        String element2 = animals.poll();
        System.out.println("使用 poll(): " + element2);
        // 使用 clear()
        animals.clear();
        System.out.println("更新后的LinkedBlockingQueue " + animals);
    }
}

Risultato dell'output

LinkedBlockingQueue: [Dog, Cat, Horse]
删除元素:
使用 remove(): Dog
使用 poll(): Cat
更新后的LinkedBlockingQueue: []

Metodi put() e take()

Nel processo multithreading, possiamo utilizzare put() e take() per bloccare l'operazione di una thread per sincronizzarla con un altro thread. Questi metodi attendono fino a quando non possono essere eseguiti con successo.

Metodo put()

Per inserire l'elemento specificato alla fine della coda bloccata della lista, utilizziamo il metodo put().

Se la coda bloccata della lista è piena, attende fino a quando la coda bloccata della lista ha abbastanza spazio per inserire l'elemento.

Ad esempio,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
       try {
          //Aggiunta di elementi a animals
           animals.put("Cane");
           animals.put("Gatto");
           System.out.println("LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

Risultato dell'output

LinkedBlockingQueue: [Cane, Gatto]

In questo caso, se interrotto durante l'attesa, il metodo put() potrebbe sollevare un'InterrupedException. Pertanto, dobbiamo includerlo inNel blocco try..catch.

Metodo take()

Per restituire e eliminare un elemento dalla coda bloccata della lista, possiamo utilizzare il metodo take().

Se la coda bloccata della lista è vuota, attende fino a quando la coda bloccata della lista ha l'elemento da eliminare.

Ad esempio,

import java.util.concurrent.LinkedBlockingQueue;
class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
       try {
           //Aggiunta di elementi a animals
           animals.put("Cane");
           animals.put("Gatto");
           System.out.println("LinkedBlockingQueue: " + animals);
           //Eliminazione di un elemento
           String element = animals.take();
           System.out.println("Eliminazione dell'elemento: " + element);
           System.out.println("Nuova LinkedBlockingQueue: " + animals);
        }
        catch(Exception e) {
            System.out.println(e);
        }
    }
}

Risultato dell'output

LinkedBlockingQueue: [Cane, Gatto]
Eliminazione dell'elemento: [Cane]
Nuova LinkedBlockingQueue: [Gatto]

In questo caso, se interrotto durante l'attesa, il metodo take() solleverà un'InterrupedException. Pertanto, dobbiamo chiuderlo in un blocco try...catch.

Altri metodi

MetodoDescrizione del contenuto
contains(element)Cercare l'elemento specificato nella coda bloccata di lista. Se trovato, restituire true, altrimenti restituire false.
size()Restituire la lunghezza della coda bloccata di lista.
toArray()Convertire la coda bloccata di lista in un array e restituire quell'array.
toString()Convertire la coda bloccata di lista in una stringa

Perché utilizzare LinkedBlockingQueue?

LinkedBlockingQueue utilizza una lista come suo archivio interno.

Si consideraThread-safeSet. Pertanto, viene utilizzato spesso nelle applicazioni multithreading.

Supponiamo che un thread stia inserendo un elemento nella coda e un altro thread stia rimuovendo un elemento dalla coda.

Ora, se il primo thread è più lento del secondo thread, la coda bloccata di lista può far attendere il secondo thread fino a quando il primo thread ha completato la sua operazione.