Java Thread Wait and Notify
-
05-07-2019 - |
Pergunta
Eu tenho dois tópicos. O Thread A está puxando alguns elementos da fila e o Thread B está adicionando alguns elementos à fila.
Eu quero que o thread a vá dormir quando a fila estiver vazia.
Quando o Thread B adiciona algum elemento à fila, ele deve garantir que o thread a esteja funcionando. Como isso pode ser feito em Java?
Solução
Use um BlockingQueue
, qual é:
UMA
Queue
Além disso, suporta operações que aguardam a fila para ficar não vazios ao recuperar um elemento e aguarde o espaço estar disponível na fila ao armazenar um elemento.
Sério, não tente reinventar a roda aqui.
(Se você devo Use Wait/Notify, Leia este tutorial. Mas poupe a dor a si mesmo, por favor!)
Outras dicas
Aqui estão alguns detalhes:
import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();
Isso é tudo o que existe com os novos recursos de rosqueamento da Java. O executor é um pool de threads com um número de dados. É alimentado por uma fila de bloqueio. Todos os fios dormem, a menos que haja trabalho a fazer. Quando você pressiona um objeto executável na fila usando o método Execute (), o objeto executável fica na fila até que haja um thread disponível para processá -lo. Então, é o método executado () é chamado. Finalmente, o método ShutdownNow () sinaliza todos os threads na piscina para desligar.
É muito mais simples agora do que costumava ser.
(Existem muitas variações sobre isso, como piscinas com números mínimos e máximos de roscas ou filas que têm tamanhos máximos antes que os threads chamam execute () bloquearem.)