3
respostas

Como organizar

Como podemos fazer para que as informações venha de forma organizada ?

Ficou um pouco confuso pra minha pessoa.

Por exemplo: Pedro faz as necessidades em quanto isso está João bate na porta está ocupado, ele deve esperar, Pedro sair, em seguida esperar a Limpeza Limpeza fez o seu papel de limpar, em seguida Pedro faz suas necessidades caso não tenha mais nenhum convidado limpeza deixa tudo limpo e encerra.

Isso parece não acontecer de forma ordenada.

Tem como nos melhorarmos isso?

3 respostas

Oi. Não entendi muito bem o problema. Qual parte parece não estar ocorrendo de forma ordenada?

não está trazendo o resultado igual do exercicio, não estou conseguindo enxergar o problema, pode ajudar? ``` package br.com.alura.banheiro;

public class Principal {

public static void main(String[] args) { // TODO Auto-generated method stub Banheiro banheiro = new Banheiro();

// Passando a tarefa e o nome do Thread Thread convidado1 = new Thread(new TarefaNumero1(banheiro), "João"); Thread convidado2 = new Thread(new TarefaNumero2(banheiro), "Pedro");

Thread limpeza = new Thread(new TarefaLimpeza(banheiro), "Limpeza"); limpeza.setDaemon(true);

limpeza.start(); convidado1.start(); convidado2.start();

limpeza.start();

}

}

package br.com.alura.banheiro;

public class TarefaLimpeza implements Runnable {

private Banheiro banheiro;

public TarefaLimpeza(Banheiro banheiro) { this.banheiro = banheiro; }

@Override public void run() { while(true) { this.banheiro.limpa(); try { Thread.sleep(15000);//limpando cada 15s } catch (InterruptedException e) { e.printStackTrace(); } } } }

package br.com.alura.banheiro;

public class Banheiro {

String nome = Thread.currentThread().getName(); private boolean ehSujo = true;

public void fazNumero1() {

String nome = Thread.currentThread().getName();

System.out.println(nome + " batendo na porta");

synchronized (this) {

System.out.println(nome + " entrando no banheiro");

while (this.ehSujo) { esperaLaFora(nome); } }

System.out.println(nome + " entrando no banheiro"); System.out.println(nome + " fazendo coisa rapida");

try { Thread.sleep(8000); } catch (InterruptedException e) { e.printStackTrace(); }

System.out.println(nome + " dando descarga"); System.out.println(nome + " lavando a mao"); System.out.println(nome + " saindo do banheiro"); }

public void fazNumero2() {

String nome = Thread.currentThread().getName();

System.out.println(nome + " entrando no banheiro"); System.out.println(nome + " fazendo coisa demorada");

try { Thread.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); }

System.out.println(nome + " dando descarga"); System.out.println(nome + " lavando a mao"); System.out.println(nome + " saindo do banheiro"); }

private void esperaLaFora(String nome) {

System.out.println(nome + ", eca, banheiro está sujo"); try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }

public void limpa() {

String nome = Thread.currentThread().getName();

System.out.println(nome + " batendo na porta");

synchronized (this) {

System.out.println(nome + " entrando no banheiro");

if (!this.ehSujo) { System.out.println(nome + ", não está sujo, vou sair"); return; }

System.out.println(nome + " limpando o banheiro"); this.ehSujo = true;

try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }

this.notifyAll();

System.out.println(nome + " saindo do banheiro"); }

}

}

Você está chamando o limpeza.start() duas vezes?