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?

Foi útil?

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.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top