Эта программа про мини-магазин, есть клиенты и есть команда уборщиков. То, что я пытаюсь сделать, - это простой вход в мини-магазин, но если магазин заражен, команда уборщиков входит, чтобы дезинфицировать, но если клиенты не входят, делают свое дело и уходят, а команда уборщиков входит и уходит.
Это код.
это основной.
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.
Может мне кто-нибудь помочь?