1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Problema com nofity e wait em Thread

Estou com o seguinte problema, tenho 2 thread uma que popula uma fila e outra que consome essa fila, o meu problema é, não quero fazer o consumidor ficar consumindo recurso enquanto não tem nada na fila (em outra palavras nao deixar um while(true) para ficar rodando inifitamente), a minha intenção é quando o nofity do produtor for chamado acordar a outra thread consumidor e fazer o processo, o problema aqui é que minha thread de produtor roda, porem a de consumidor só é chamada após o fim de todo o processo da thread do produtor, com isso tenho o seguinte teste


static Queue<Print> queue = new CircularQueue<>(10);

public static void main(String[] args) {

        Thread produtor = new Thread() {
            public void run() {
                synchronized (queue) {
                    Random random = new Random();
                    for (int i = 0; i < 10; i++) {
                        System.out.println("Adicionado job");
                        try {
                            Thread.sleep(random.nextInt(5) * 1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        queue.add(new Job("jobName", 4));

                        System.out.println("nofiticando");
                        queue.notify();
                    }
                }
            };
        };

        Thread consumidor = new Thread() {
            public void run() {
                synchronized (queue) {
                    try {
                        if (queue.getNumerberOfJobs() == 0) {
                            System.out.println("aguardando");
                            queue.wait();
                        }
                        System.out.println("Realizando job");
                        queue.remove();
                        System.out.println("Removendo da fila");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                };
            };
        };

        consumidor.start();
        produtor.start();

    }
  • Já tentou chamar consumidor.notify() ? ao em vez de chamar o notify da queue. Guarda a instância da Thread consumidora num atributo pra poder acessar e chamar o notify dai.

    marcosharbs   10 de out de 2013
  • Não tinha reparado direito, mas o ViniGodoy ta certo você precisa de um loop no seu consumidor.

    marcosharbs   10 de out de 2013
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags threads ou faça a sua própria pergunta.