Sempre que executo minha classe Principal da Uma Exception ----> Exception in thread "main" java.lang.IllegalThreadStateException at java.base/java.lang.Thread.setDaemon(Thread.java:1458) at br.com.alura.banheiro.Principal.main(Principal.java:14). E não descobri como resolver.
Classe Principal
package br.com.alura.banheiro;
public class Principal {
public static void main(String[] args) {
Banheiro banheiro = new Banheiro();
Thread convidado1 = new Thread(new TarefaNumero1(banheiro), "Gustavo");
Thread convidado2 = new Thread(new TarefaNumero2(banheiro), "Paulo");
Thread DonaLimpeza = new Thread(new TarefaLimpeza(banheiro), "DonaLimpeza");
DonaLimpeza.setPriority(10);
DonaLimpeza.start();
DonaLimpeza.setDaemon(true);
convidado1.start();
convidado2.start();
DonaLimpeza.start();
}
}
Classe Banheiro
package br.com.alura.banheiro;
public class Banheiro {
public 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 + " fazendo coisa rapida");
dormeUmPouco(5000);
this.ehSujo = true;
System.out.println(nome + " dando descarga");
System.out.println(nome + " lavando a mão");
System.out.println(nome + " saindo do banheiro");
}
}
public void FazNumero2() {
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 + " fazendo coisa demorada");
dormeUmPouco(10000);
this.ehSujo = true;
System.out.println(nome + " dando descarga");
System.out.println(nome + " lavando a mão");
System.out.println(nome + " saindo do banheiro");
}
}
private void dormeUmPouco(long millis) {
try {
Thread.sleep(millis);
}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 esta sujo, vou sair!");
return;
}
System.out.println(nome + " limpando banheiro");
this.ehSujo = false;
try {
Thread.sleep(13000);
}catch(InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
System.out.println(nome + ", saindo do banheiro");
}
}
public void esperaLaFora(String nome) {
System.out.println(nome + ", eca, o banheiro está sujo!");
try {
this.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
Classe TarefaLimpeza
package br.com.alura.banheiro;
public class TarefaLimpeza implements Runnable{
private Banheiro banheiro;
public TarefaLimpeza(Banheiro banheiro) {
this.banheiro = banheiro;
}
public void run() {
while(true) {
this.banheiro.limpa();
try {
Thread.sleep(20000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
Classe TarefaNumero1
package br.com.alura.banheiro;
public class TarefaNumero1 implements Runnable{
private Banheiro banheiro;
public TarefaNumero1(Banheiro banheiro) {
this.banheiro = banheiro;
}
public void run() {
banheiro.FazNumero1();
}
}
Classe Tarefa Numero2
package br.com.alura.banheiro;
public class TarefaNumero2 implements Runnable{
private Banheiro banheiro;
public TarefaNumero2(Banheiro banheiro) {
this.banheiro = banheiro;
}
public void run() {
banheiro.FazNumero2();
}
}