No artigo anterior, apresentei as ferramentas de programação simultânea java: BlockingQueue interface, ArrayBlockingQueue, DelayQueue, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue. Este é o sétimo artigo da série.
BlockingDeque
A interface é definida da BlockingQueue
mesma forma que a interface java.util.concurrent
e representa uma "fila dupla" thread-safe, que adiciona elementos à fila ou obtém elementos de maneira thread-safe. Este artigo levará todos a aprenderem mais BlockingDeque
.
deque
É uma abreviatura de "Double Ended Queue". Portanto, o significado de "fila dupla" é uma fila que pode inserir e remover elementos de ambas as extremidades (o início ou o fim da fila).
Se um thread produz e consome elementos da mesma fila, um deque pode ser usado BlockingDeque
. Se o encadeamento de produção precisar ser inserido em ambas as extremidades da fila e o encadeamento de consumo precisar ser excluído de ambas as extremidades da fila, também é possível usar apenas a BlockingDeque
fila de duas extremidades. Consulte a figura abaixo para entender
Um thread produz elementos e os insere em qualquer uma das extremidades da fila. Se a BlockingDeque
corrente estiver cheia, insira o segmento será bloqueado até que o segmento seja removido da BlockingDeque
remoção de um elemento. Se estiver BlockingDeque
vazio, o thread de remoção será bloqueado até que o thread de inserção insira um elemento BlockingDeque
nele.
Método BlockingDeque
BlockingDeque
Existem 4 métodos diferentes para inserir, excluir e verificar os elementos no deque. Cada grupo de métodos se comporta de maneira diferente quando a operação necessária não pode ser executada imediatamente. Consulte a tabela abaixo
Chefe de operação da equipe | Lançar uma exceção | Retorne um valor específico | Esperando após o bloqueio | Tempo limite de espera após bloqueio |
---|---|---|---|---|
Inserir objeto | addFirst (o) | offerFirst (o) | putFirst (o) | offerFirst (o, tempo limite, unidade de tempo) |
Remover objeto | removeFirst (o) | pollFirst () | takeFirst () | pollFirst (tempo limite, unidade de tempo) |
Verifique a existência do objeto | getFirst () | peekFirst () |
Operação de cauda | Lançar uma exceção | Retorne um valor específico | Esperando após o bloqueio | Tempo limite de espera após bloqueio |
---|---|---|---|---|
Inserir objeto | addLast (o) | offerLast (o) | putLast(o) | offerLast (o, tempo limite, unidade de tempo) |
Remover objeto | removeLast (o) | pollLast () | takeLast () | pollLast (tempo limite, unidade de tempo) |
Verifique a existência do objeto | Obtenha o último() | peekLast () |
Como você pode ver, esses métodos BlockingQueue
são um pouco semelhantes aos métodos e , exceto que xxxFirst e xxxLast são adicionados ao método, portanto, você pode consultar meu artigo anterior para comparação. O significado dos quatro comportamentos do método acima é
- Lançar uma exceção : se o resultado não puder ser respondido imediatamente após a chamada do método (fila vazia ou fila cheia), uma exceção será lançada.
- Valor específico de retorno : Se o resultado não puder ser respondido imediatamente após a chamada do método (fila vazia ou fila cheia), então um valor específico (geralmente verdadeiro / falso) é retornado, verdadeiro significa que o método foi executado com sucesso, caso contrário, significa que o método falha ao executar.
- Esperando após o bloqueio : Se o método não puder ser respondido ao resultado imediatamente após a chamada do método (fila vazia ou fila cheia), o método será bloqueado e mantido no estado de espera.
- Aguardando timeout após bloqueio : Se o método não puder responder ao resultado imediatamente (fila vazia ou fila cheia) após a chamada do método, o método será bloqueado aguardando um determinado período de tempo, ou seja, bloqueado dentro do período de timeout. Quando o tempo limite expirar, o thread do método não bloqueará mais, mas retornará um valor específico (geralmente verdadeiro / falso), verdadeiro significa que o método foi executado com sucesso, caso contrário, significa que o método falhou ao executar.
BlockingDeque 继承 BlockingQueue
A interface BlockingDeque herda a interface BlockingQueue. Isso significa que você pode usar BlockingDeque como BlockingQueue. Se você fizer isso, os vários métodos de inserção adicionarão o elemento ao final do deque, e o método remove removerá o elemento da cabeça do deque. Os métodos de inserção e exclusão da interface BlockingQueue fazem exatamente isso.
A seguir está uma tabela de comparação da função do método BlockingQueue na implementação de BlockingDeque
BlockingQueue | BlockingDeque |
---|---|
adicionar() | addLast () |
oferta() | offerLast () |
colocar() | putLast () |
remover() | removeFirst () |
votação | pollFirst () |
levar() | takeFirst () |
elemento() | getFirst () |
olhadinha() | peekFirst () |
Classe de implementação da interface BlockingDeque
BlockingDeque
É uma interface, portanto, quando realmente a instanciamos, precisamos usar sua classe de implementação de interface. java.util.concurrent
Os LinkedBlockingDeque
métodos do pacote implementam a BlockingDeque
interface.
Seu método de uso é BlockingQueue
semelhante ao do mesmo, portanto, apenas uma breve introdução é dada aqui.
//初始化一个LinkedBlockingDeque
BlockingDeque<String> deque = new LinkedBlockingDeque<String>();
deque.addFirst("1");//向队首添加元素
deque.addLast("2"); //向队尾添加元素
String two = deque.takeLast(); //从队尾获取元素
String one = deque.takeFirst(); //从队首获取元素
Bem-vindo a seguir meu blog, existem muitas coleções boutique
- Este artigo é reproduzido com a indicação da fonte (a conexão deve ser anexada, e o texto não pode ser reproduzido somente): Carta Blog da Brother .
Se você acha que é útil para você, por favor, curta e compartilhe para mim! Seu apoio é minha motivação criativa inesgotável! . Além disso, o autor produziu o seguinte conteúdo de alta qualidade recentemente e espero sua atenção.