Segue minha implementação:
Classe Banheiro:
package br.com.alura.threads.banheiro;
public class Banheiro {
public void fazNumero1() {
String nome = Thread.currentThread().getName();
baterAPorta(nome);
// Sincronizar esse acesso (o acesso do meu objeto)
synchronized(this) {
System.out.println(nome + " entrando no banheiro");
System.out.println(nome +" fazendo coisa rapida");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(nome +" dando descarga");
System.out.println(nome +" lavando as maos");
System.out.println(nome +" saindo do banheiro");
}
}
public void fazNumero2() {
String nome = Thread.currentThread().getName();
baterAPorta(nome);
// Sincronizar esse acesso (o acesso do meu objeto)
synchronized(this) {
System.out.println(nome +" entrando no banheiro");
System.out.println(nome +" fazendo coisa demorada");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(nome +" dando descarga");
System.out.println(nome +" lavando as maos");
System.out.println(nome +" saindo do banheiro");
}
}
public void baterAPorta(String nome) {
System.out.println(nome + " est\u00E1 batendo \u00E0 porta");
}
}
Classe Principal:
package br.com.alura.threads.banheiro;
import br.com.alura.threads.banheiro.tarefas.TarefaNumero1;
import br.com.alura.threads.banheiro.tarefas.TarefaNumero2;
public class Principal {
public static void main(String[] args) {
Banheiro banheiro = new Banheiro();
Runnable tarefaNum1 = new TarefaNumero1(banheiro);
Runnable tarefaNum2 = new TarefaNumero2(banheiro);
Thread convidado1 = new Thread(tarefaNum1, "convidado1");
Thread convidado2 = new Thread(tarefaNum2, "convidado2");
Thread convidado3 = new Thread(tarefaNum2, "convidado3");
Thread convidado4 = new Thread(tarefaNum1, "convidado4");
convidado1.start();
convidado2.start();
convidado3.start();
convidado4.start();
}
}
Classe TarefaNumero1:
package br.com.alura.threads.banheiro.tarefas;
import br.com.alura.threads.banheiro.Banheiro;
public class TarefaNumero1 implements Runnable {
private Banheiro banheiro;
public TarefaNumero1(Banheiro banheiro) {
this.banheiro = banheiro;
}
@Override
public void run() {
banheiro.fazNumero1();
}
}
Classe Tarefa Número 2:
package br.com.alura.threads.banheiro.tarefas;
import br.com.alura.threads.banheiro.Banheiro;
public class TarefaNumero2 implements Runnable {
private Banheiro banheiro;
public TarefaNumero2(Banheiro banheiro) {
this.banheiro = banheiro;
}
@Override
public void run() {
banheiro.fazNumero2();
}
}
P.S.: Adorei essa aula rs