Se o BlockingQueue estiver cheio, qualquer operação que tente armazenar as coisas será bloqueada e não será despertada para continuar as operações até que haja um novo espaço no BlockingQueue.
Os principais métodos fornecidos pelo BlockingQueue são:
Adicione (AnoBject): Adicione o AnoBject ao BlockingQueue.
OFERECIMENTO (ANOBJECT): Adicione o AnoBject ao BlockingQueue.
Coloque (Anobject): Adicione o AnoBject ao BlockingQueue.
Enquete (tempo): Retire o objeto classificado primeiro em BlockingQueue. Retorna nulo quando não pode ser recuperado.
Take (): Retire o objeto classificado primeiro em BlockingQueue.
Existem 4 implementações específicas do BlockingQueue de acordo com diferentes necessidades:
(1) ArrayblockingQuee: o construtor do tamanho especificado deve ter um parâmetro int para indicar seu tamanho. Os objetos que ele contém são classificados em ordem FIFO (primeira entrada, primeiro a sair).
(2) LinkedBlockingQuee: BlockingQueue com tamanho variável.
Se o parâmetro de tamanho não estiver incluído, o tamanho do BlockingQuee gerado será determinado pelo número inteiro.max_value. Os objetos que ele contém são classificados em ordem FIFO (primeira entrada, primeiro a sair).
Comparado com o LinkedBlockingQueue e o ArrayBlockingQueue, as estruturas de dados usadas atrás deles são diferentes.
A taxa de transferência de dados do LinkEdBlockingQuee é maior que a do ArrayBlockingQueue, mas sua previsibilidade de desempenho é menor que a do ArrayBlockockQueue quando o número de encadeamentos é grande.
(3) PriorityBlockingQuee: semelhante ao LinkedBlockingQueue, mas a classificação dos objetos que ele contém não é FIFO, mas é determinada pela ordem de classificação natural dos objetos ou pela ordem determinada pelo comparador trazido pelo construtor.
(4) Síncrono: um BlockingQueue especial, a operação deve ser concluída alternadamente colocando e buscando.
A cópia do código é a seguinte:
pacote com.yao;
importar java.util.concurrent.arrayblockqueue;
importar java.util.concurrent.blockingQueue;
importar java.util.concurrent.executorService;
importar java.util.concurrent.executores;
classe pública BlockingQueueTest {
/**
Definindo a cesta para a Apple
*/
Public Static Class Basket {
// cesta, capaz de segurar 3 maçãs
BlockingQueue <String> cesto = new ArrayBlockingQueue <String> (3);
// produz maçãs e coloque -as em uma cesta
public void Produce () lança interruptedException {
// Coloque uma maçã no método de put.
basquete.put ("uma maçã");
}
// consome maçãs e tirá -las da cesta
public string consume () lança interruptedException {
// O Método Get retira uma Apple.
String Apple = Basket.take ();
devolver a maçã;
}
public int getApplenumber () {
retornar cesto.size ();
}
}
// Método de teste
public static void testBasket () {
// Construa uma cesta com maçãs
cesta final da cesta = nova cesta ();
// Defina o produtor da Apple
classe produtor implementa Runnable {
public void run () {
tentar {
while (true) {
// produzem maçã
System.out.println ("Produtor está pronto para produzir maçãs:"
+ System.currenttimemillis ());
cesto.produce ();
System.out.println ("Produtor terminou de produzir maçãs:"
+ System.currenttimemillis ());
System.out.println ("Após a produção, existem maçãs:"+cesto.getApplenumber ()+");
// Sono de 300ms
Thread.sleep (300);
}
} catch (interruptedException ex) {
}
}
}
// define consumidores de maçã
classe o consumidor implementa Runnable {
public void run () {
tentar {
while (true) {
// consumo de maçã
System.out.println ("Os consumidores estão prontos para consumir a Apple:"
+ System.currenttimemillis ());
Basking.Consume ();
System.out.println ("Consumidor consome maçã"
+ System.currenttimemillis ());
System.out.println ("Após o consumo, existem maçãs:"+cesto.getAppleNumber ()+");
// 1000ms Sleep
Thread.sleep (1000);
}
} catch (interruptedException ex) {
}
}
}
ExecutorService Service = executores.newcachedthreadpool ();
Produtor produtor = new Producer ();
Consumidor consumidor = novo consumer ();
Service.submit (produtor);
Service.submit (consumidor);
// Depois que o programa dura 10 segundos, todas as tarefas serão interrompidas
tentar {
Thread.sleep (10000);
} catch (interruptedException e) {
}
Service.shutdownNow ();
}
public static void main (string [] args) {
BlockingQueueTest.TestBasket ();
}
}