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)