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

Espera e notificação de threads (wait e notify)

Boa noite companheiros, estou estudando o capitulo 9 do livro da katty scjp6, e estou tentando fazer um exercicio que envolve threads e os métodos wait() e notify().

O contexto do exercício é mais ou menos este:

  • Fazer um programa onde se tenha um costureiro e uma máquina de costura, assim que o costureiro entrar com os dados largura e altura, notificar a máquina de costura para que ela realize seu trabalho.

Estou tentando fazer o exercicio mas não esta dando certo os bloqueios dos objetos. Segue o código que fiz.

Classe que deveria notificar a máquina para executar a costura do forro de mesa

package thread.maqcostura;

import java.util.Scanner;

public class Costureiro extends Thread {

    Scanner in = new Scanner(System.in);
    int altura, largura;
    public void run() {
        while(true) {
            synchronized (this) {
                System.out.print("Altura: ");
                altura = in.nextInt();
                System.out.print("Largura: ");
                largura = in.nextInt();
                notify();
            }
        }
    }

    public String getForma() {
        return "Forro de mesa : " + (altura * largura);
    }
}

Classe que representa a maquina de costura

package thread.maqcostura;


public class Maquina extends Thread{

    private Costureiro c;

    public Maquina(Costureiro c) {
        this.c = c;
    }


    public void run() {
        while(true) {
            synchronized (c) {
                try {

                    System.out.println("Aguardando forma...");
                    c.wait();

                    System.out.println("Iniciando costura...");
                    Thread.currentThread().sleep(3000);

                    System.out.println("Costurando...");
                    Thread.currentThread().sleep(3000);

                    System.out.println(c.getForma() + ", concluido");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Assim que entro com os dados (altura, largura) a thread fica sempre me pedindo para entrar com os dados infinitamente. Pra mim ao digitar os dados o notify() seria chamado colocando a thread que informei os dados em "tipo pausa" e aguardaria a execução da máquina.

  • De fato, tentei corrigir seu exercício mas é mais complicado que parece. Pra início de conversa, wait nunca deve ficar "sozinho" mas dentro de um loop, onde é testada uma determinada condição (o que não está presente no seu código). (Acho que é por isso que não gosto de usar wait/notify, é muito difícil usá-los corretamente). Tentei pôr uma condição mas acho que também estou fazendo algo errado.

    entanglement   30 de jul de 2013
  • Vou postar algo no stackoverflow pra ver se tenho alguma respostas, e se obtiver, replico aqui, obrigado entan.

    diegohsi   30 de jul de 2013
  • se vc remover os while(true) funciona perfeitamente... (vamo ver como contornar isso)

    Diogo   30 de jul 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!

2 respostas

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