Thead не просыпается, когда я использую notify () - PullRequest
0 голосов
/ 16 июня 2020

Эта программа про мини-магазин, есть клиенты и есть команда уборщиков. То, что я пытаюсь сделать, - это простой вход в мини-магазин, но если магазин заражен, команда уборщиков входит, чтобы дезинфицировать, но если клиенты не входят, делают свое дело и уходят, а команда уборщиков входит и уходит.

Это код.

это основной.

public class Main {

    public static void main(String[] args) {
        int contCliente;

        List<Cliente> cli = new ArrayList<Cliente>();
        Ação a = new Ação();

        Scanner sc = new Scanner(System.in);

        System.out.print("Indique quantos clientes deseja: ");
        int clientes = sc.nextInt();
        System.out.println("");

        for(contCliente = 1; contCliente <= clientes; contCliente++) {
            System.out.print("Indique o nome dos clientes: ");
            String nomeCli = sc.next();
            System.out.println("");
            cli.add(new Cliente(nomeCli));
        }

        for(Cliente c : cli) {
            System.out.println(c.nome + " esperando na entrada da mini loja.");
        }
        System.out.println("Limpeza esperando na entrada da mini loja.");
        System.out.println("");

        String nomeLim = "Limpeza";

        for(int i = 0; i < clientes; i++) {
            Thread acao = new Thread(new Cliente(a, i, cli));
            acao.start();
            if(i < 1) {
                Thread limpeza = new Thread(new Limpeza(a, nomeLim));
                limpeza.start();
                try {
                    limpeza.join();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }               
            }
            try {
                acao.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           
        }

        sc.close();

    }

}

Это то, что будут выполняться потоки.

public class Ação{

    public boolean contaminado = Math.random() >= 0.5;

    public Ação(boolean contaminado) {
        this.contaminado = contaminado;
    }

    public Ação() {}


    public void Entrada(int clientes, List<Cliente> cliente) {
        int atividade = getRandomInteger(1 ,2);
        int tempo = getRandomInteger(500 ,1000);

        synchronized(this) {

            System.out.println(cliente.get(clientes).nome + " Entrando na mini loja e desinfetando as mãos.");
            try {
                Thread.sleep(tempo);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(contaminado);
            if(contaminado == true) {

                System.out.println(cliente.get(clientes).nome + " a mini loja está contaminada. Perigo!");
                try {
                    wait();
                } catch (InterruptedException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            }else {
                System.out.println(cliente.get(clientes).nome + " Fazendo atividade " + atividade + ".");
                tempo = getRandomInteger(500 ,1000);
                try {
                    Thread.sleep(tempo);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(cliente.get(clientes).nome + " Pagando as compras.");
                tempo = getRandomInteger(500 ,1000);
                try {
                    Thread.sleep(tempo);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(cliente.get(clientes).nome + " Desinfetando as mãos.");
                tempo = getRandomInteger(500 ,1000);
                try {
                    Thread.sleep(tempo);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(cliente.get(clientes).nome + " Saindo da mini loja.");
                System.out.println("");
                System.out.println("");
            }   
            notifyAll();
        }
    }

    public void Limpeza(String nome) {
        int tempo = getRandomInteger(500 ,1000);
        synchronized(this) {
            System.out.println(nome + " entrando na mini loja.");
            try {
                Thread.sleep(tempo);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(nome + " desinfetando a miniloja, espere!");
            try {
                Thread.sleep(tempo);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("");
            System.out.println("");
            contaminado = false;    
            notifyAll();
        }
    }

Моя проблема здесь заключается в том, что когда загрязненное значение истинно, то поток, который находится в ожидании, и когда я уведомляю thead, выполняет все остальное, что ему нужно выполнить.

Это результат работы программы.

Indique quantos clientes deseja: 2

Indique o nome dos clientes: Gui

Indique o nome dos clientes: Mota

Gui esperando na entrada da mini loja.
Mota esperando na entrada da mini loja.
Limpeza esperando na entrada da mini loja.

Gui Entrando na mini loja e desinfetando as mãos.
true
Gui a mini loja está contaminada. Perigo!
Limpeza entrando na mini loja.
Limpeza desinfetando a miniloja, espere!


Mota Entrando na mini loja e desinfetando as mãos.
false
Mota Fazendo atividade 1.
Mota Pagando as compras.
Mota Desinfetando as mãos.
Mota Saindo da mini loja.

Может мне кто-нибудь помочь?

...