Ferramenta de programação simultânea Java JUC Parte Sete: BlockingDeque Double-ended Blocking Queue

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.

BlockingDequeA interface é definida da BlockingQueuemesma forma que a interface java.util.concurrente 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 BlockingDequefila 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 BlockingDequecorrente estiver cheia, insira o segmento será bloqueado até que o segmento seja removido da BlockingDequeremoção de um elemento. Se estiver BlockingDequevazio, o thread de remoção será bloqueado até que o thread de inserção insira um elemento BlockingDequenele.

Método BlockingDeque

BlockingDequeExistem 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 BlockingQueuesã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 é

  1. 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.
  2. 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.
  3. 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.
  4. 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.concurrentOs LinkedBlockingDequemétodos do pacote implementam a BlockingDequeinterface.

Seu método de uso é BlockingQueuesemelhante 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.

Acho que você gosta

Origin blog.csdn.net/hanxiaotongtong/article/details/115291864
Recomendado
Clasificación