Fila de bloqueio BlockingQueue combate real e sua análise de princípio

1. Introdução ao BlockingQueue

1. Interface de nível superior da fila (fila)

add(E) adiciona um elemento, retorna true se for bem-sucedido, caso contrário, retorna uma exceção

offer(E) Adiciona elementos, retorna true se for bem-sucedido, caso contrário, retorna false

remove() retorna e remove o elemento head da fila e retorna uma exceção se a fila estiver vazia

poll() retorna e remove o primeiro elemento da fila e retorna null se a fila estiver vazia

peek() Obtém o primeiro elemento da fila, retorna null se a fila estiver vazia

BlockingQueue herda de Queue e fornece recursos de bloqueio. Existem métodos comuns para entrar e sair da fila

Enfileirar: put(E) offer(E) offer(E,long,TimeUnit)

出队:poll(),poll(long,TimeUnit),take()

1.1 Métodos comuns de BlockingQueue na prática

Existem quatro métodos comumente usados ​​na demonstração: add remove offer poll é usado, o que está em conformidade com as características de primeiro a entrar, primeiro a sair da fila.

import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueTest {

    public static void main(String[] args) {

        //测试add remove offer poll
        Queue addblockingQueue = new ArrayBlockingQueue(2);
        addblockingQueue.add(1);
        addblockingQueue.add(2);
//        addblockingQueue.add(3);//放入第三个Exception in thread "main" java.lang.IllegalStateException: Queue full

//        addblockingQueue.remove();
//        addblockingQueue.remove();
//        addblockingQueue.remove();//移出第三个Exception in thread "main" java.util.NoSuchElementException

        Queue offerblockingQueue = new ArrayBlockingQueue(2);
        System.out.println(offerblockingQueue.offer(1));//返回true
        System.out.println(offerblockingQueue.offer(2));//返回true
        System.out.println(offerblockingQueue.offer(3));//返回false

        System.out.println(offerblockingQueue.poll());//返回1
        System.out.println(offerblockingQueue.poll());//返回1 符合队列特性先进先出
        System.out.println(offerblockingQueue.poll());//返回null
    }
}

1.2 Filas comumente usadas

Cenários de aplicativos de fila: as filas são thread-safe e geralmente as usamos em pools de threads, middleware como modo produtor-consumidor e registro nacos. 

1.2.1  Introdução ao ArrayBlockingQueue (TODO)

 ArrayBlockingQueue é uma fila de bloqueio limitada. A camada inferior é baseada em uma implementação de array. Ele usa reenTrantLock para garantir a segurança do encadeamento. É uma boa opção usá-lo em geral. No entanto, em cenários de alta simultaneidade, porque reenTrantLock é usado para bloquear e desbloquear, a velocidade de inserção e extração será chamada de gargalo de desempenho. LinkedBlockingQueue é geralmente usado em cenários de alta simultaneidade. Consulte 1.1 para o código de combate real

Foco da análise do código-fonte:

1. Método de construção

2. Elementos usados: array, reenTrantLock, duas filas condicionais (não cheias e vazias)

3. métodos put e take

 1.2.2 Introdução ao linkedBlockingQueue (TODO)

linkedBlockingQueue é uma fila de bloqueio limitada implementada por uma lista vinculada, mas seu valor máximo padrão é Integer.MAX_VALUE, que é um número muito grande, por isso costumamos dizer que é uma fila de bloqueio ilimitada. Quando a memória é insuficiente, ocorrerá um problema de OOM, portanto, para resolver esse problema, o tamanho da fila geralmente é especificado durante a inicialização. linkedBlockingQueue também usa ReentrantLock para garantir a segurança do thread. A diferença de arrayBlockingQueue é que ele possui dois bloqueios, um para entrar na fila e outro para sair da fila. Há também duas filas condicionais para garantir o despertar de entrada e saída da fila .

Foco da análise do código-fonte:

1. Método de construção

2. Elementos usados

3. colocar, tirar, remover método

1.2.3 Introdução ao LinkedBlockingDeque

Deque é uma fila dupla de bloqueio com características semelhantes a linkedBolckingQueue. Ao contrário de linkedBolckingQueue, ela possui apenas um bloqueio reentrantLock e várias outras APIs para operar os elementos no início e no fim da fila.

addFirst(E e) 
addLast(E e) 
ofertaFirst(E e) 
ofertaLast(E e)

 

 

Acho que você gosta

Origin blog.csdn.net/qq_21575929/article/details/124774267
Recomendado
Clasificación