Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: Fila de Bloqueio | Coleções Sincronizadas
Quizzes & Challenges
Quizzes
Challenges
/
Multithreading em Java

bookDesafio: Fila de Bloqueio

Tarefa

Será necessário implementar alguns métodos de BlockingQueue para compreender melhor como a coleção funciona e para aprimorar o entendimento do material!

É necessário acessar BlockingQueueueImpl; na própria classe haverá 2 métodos não implementados que precisam ser desenvolvidos. Não é necessário criar uma solução complexa, basta repetir a funcionalidade de uma BlockingQueueue comum.

Note
Nota

Você também possui uma classe Main na qual será necessário testar sua BlockingQueueueImpl para garantir que ela funcione corretamente.

Você pode verificar isso adicionando mais de 10 itens à queue (ou mais do que o limit que você inicializou no construtor) e o próximo item terá que aguardar até que haja menos itens na fila do que o limite e só então será possível inserir o próximo item.

put() - método sincronizado que adiciona itens à fila se o limite da fila não for excedido; caso contrário, pausa a fila

take() - método sincronizado que retira um item da fila, retorna e remove o item; se a fila estiver vazia, pausa a fila

Dica de Solução

Para implementar put(), deve-se verificar se a fila está cheia, ou seja, se não é igual ao limite e, caso esteja, pausar a thread. Se não estiver cheia, deve-se verificar se a fila está vazia (isEmpty()) e, se a thread estiver vazia, chamar o método que libera todas as threads (notifyAll()). Em seguida, adicionar o item à queue.

Para implementar take(), é necessário verificar se a fila está vazia; se estiver vazia, pausar a thread (pois não há nada para ler). Se a fila não estiver vazia, realizar outra verificação para a completude da lista e, se o tamanho da lista for igual ao limit, liberar todas as threads e retornar o primeiro item da fila (aquele que foi adicionado antes dos outros).

Métodos necessários para executar

  • wait() - pausa a thread;
  • notifyAll() - acorda todas as threads que estão pausadas;
  • queue.isEmpty() - Verifica se a fila está vazia (true - fila está vazia).

Após implementar esses métodos e testar na classe Main, acesse /src/test/java/BlockingQueueueImplTest.java e execute todos os testes.

Se eles executarem com sucesso, parabéns, você fez tudo corretamente! Caso contrário, ou a solução está incorreta ou você alterou algo que não deveria ter sido alterado.

Note
Nota

Tente também resolver o problema sozinho, mas se não conseguir e quiser saber a resposta, há um link para a solução. Apenas não copie o código, mas tente entender!

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 4

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 3.33

bookDesafio: Fila de Bloqueio

Deslize para mostrar o menu

Tarefa

Será necessário implementar alguns métodos de BlockingQueue para compreender melhor como a coleção funciona e para aprimorar o entendimento do material!

É necessário acessar BlockingQueueueImpl; na própria classe haverá 2 métodos não implementados que precisam ser desenvolvidos. Não é necessário criar uma solução complexa, basta repetir a funcionalidade de uma BlockingQueueue comum.

Note
Nota

Você também possui uma classe Main na qual será necessário testar sua BlockingQueueueImpl para garantir que ela funcione corretamente.

Você pode verificar isso adicionando mais de 10 itens à queue (ou mais do que o limit que você inicializou no construtor) e o próximo item terá que aguardar até que haja menos itens na fila do que o limite e só então será possível inserir o próximo item.

put() - método sincronizado que adiciona itens à fila se o limite da fila não for excedido; caso contrário, pausa a fila

take() - método sincronizado que retira um item da fila, retorna e remove o item; se a fila estiver vazia, pausa a fila

Dica de Solução

Para implementar put(), deve-se verificar se a fila está cheia, ou seja, se não é igual ao limite e, caso esteja, pausar a thread. Se não estiver cheia, deve-se verificar se a fila está vazia (isEmpty()) e, se a thread estiver vazia, chamar o método que libera todas as threads (notifyAll()). Em seguida, adicionar o item à queue.

Para implementar take(), é necessário verificar se a fila está vazia; se estiver vazia, pausar a thread (pois não há nada para ler). Se a fila não estiver vazia, realizar outra verificação para a completude da lista e, se o tamanho da lista for igual ao limit, liberar todas as threads e retornar o primeiro item da fila (aquele que foi adicionado antes dos outros).

Métodos necessários para executar

  • wait() - pausa a thread;
  • notifyAll() - acorda todas as threads que estão pausadas;
  • queue.isEmpty() - Verifica se a fila está vazia (true - fila está vazia).

Após implementar esses métodos e testar na classe Main, acesse /src/test/java/BlockingQueueueImplTest.java e execute todos os testes.

Se eles executarem com sucesso, parabéns, você fez tudo corretamente! Caso contrário, ou a solução está incorreta ou você alterou algo que não deveria ter sido alterado.

Note
Nota

Tente também resolver o problema sozinho, mas se não conseguir e quiser saber a resposta, há um link para a solução. Apenas não copie o código, mas tente entender!

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 2. Capítulo 4
some-alt