Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Estou com dúvida no meu código

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();
    }

}
2 respostas
solução

Gustavo da uma olhadinha na sua classe Principal, voce esta colocando o setDaemon depois de startar a Thread, tente colocar antes, e outra coisa, voce esta startando a Thread DonaLimpeza duas vezes, remova a ultima e teste o seu codigo.

`

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.setDaemon(true);

    DonaLimpeza.start();
    convidado1.start();
    convidado2.start();

    }
}

Abs.

Nossa mano Muito Obrigado mesmo, era uma coisa tão simples mas nem notei, mas é assim msm errando que a gente aprende! Obrigado mesmo mano.