Bom dia,
Não to conseguindo fazer com que os aviões dependam da pista. Preciso fazer com que elas dependam se a pista está disponível, só um avião possa voar em uma pista. Se a pista estiver ocupada, nenhum outro pode voar.
package simuladorvoo;
class Aviao implements Runnable {
private Aeroporto aeroporto;
private String idAviao;
private long tempoVoo=0;
public Aviao(Aeroporto aeroporto, String idAviao,long tempoVoo) {
this.aeroporto = aeroporto;
this.idAviao = idAviao;
this.tempoVoo=tempoVoo;
}
public void run() {
try {
Thread.sleep(tempoVoo/2);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
decolar();
voar();
aterrisar();
}
private synchronized void decolar() {
System.out.println(idAviao + ": esperando pista...");
String acao=idAviao + ": decolando...";
aeroporto.esperarPistaDisponivel(acao); // Espera uma pista livre
}
private void voar() {
System.out.println(idAviao + ": voando...");
try {
Thread.sleep(tempoVoo);
} catch (InterruptedException e) {
System.err.println(e);
}
}
private void aterrisar() {
System.out.println(idAviao + ": esperando pista...");
String acao=idAviao + ": aterissando...";
aeroporto.esperarPistaDisponivel(acao); // Espera uma pista livre
}
}
class Aeroporto implements Runnable {
private boolean temPistaDisponivel = true;
private String nomeAeroporto;
public Aeroporto(String nomeAeroporto) {
this.nomeAeroporto = nomeAeroporto;
}
public void esperarPistaDisponivel(String acao) {
System.out.println(acao);
}
public synchronized void mudarEstadoPistaDisponivel() {
// Inverte o estado da pista.
temPistaDisponivel = !temPistaDisponivel;
if(temPistaDisponivel) {
this.notify();
}
System.out.println(nomeAeroporto + " tem pista disponível: " + (temPistaDisponivel == true ? "Sim" : "Não"));
// Notifica a mudanca de estado para quem estiver esperando.
}
public void run() {
System.out.println("Rodando aeroporto " + nomeAeroporto);
while (true) {
try {
mudarEstadoPistaDisponivel();
// Coloca a thread aeroporto dormindo por um tempo de 0 a 5s
Thread.sleep((int)(Math.random()*5000));
} catch (InterruptedException e) {
System.err.println(e);
}
}
}
} /*
- Simulador de voo com threads */ public final class SimuladorVoo {
public static void main(String[] args) {
System.out.println("Rodando simulador de voo.");
// Constroi aeroporto e inicia sua execucao.
// NÃO MEXER NESSE TRECHO
Aeroporto santosDumont = new Aeroporto("Santos Dumont");
Thread threadAeroporto = new Thread(santosDumont);
// Constrói aviao e inicia sua execucao.
// NÃO MEXER NESSE TRECHO
Aviao aviao14bis = new Aviao(santosDumont, "Avião 14BIS",10000);
Aviao hercules = new Aviao(santosDumont, "hercules",15000);
Aviao legacy = new Aviao(santosDumont, "legacy",20000);
Aviao boing = new Aviao(santosDumont, "boing",25000);
Aviao fVinteEdois = new Aviao(santosDumont, "fVinteEdois",9000);
Aviao vant = new Aviao(santosDumont, "vant",5000);
Thread thread14bis = new Thread(aviao14bis);
Thread threadHercules = new Thread(hercules);
Thread threadLegacy = new Thread(legacy);
Thread threadBoing = new Thread(boing);
Thread threadFvinteEdois = new Thread(fVinteEdois);
Thread threadVant = new Thread(vant);
// Inicia as threads
threadAeroporto.start();
thread14bis.start();
threadHercules.start();
threadLegacy.start();
threadBoing.start();
threadFvinteEdois.start();
threadVant.start();
try {
// Junta-se ao término da execução da thread do aeroporto
threadAeroporto.join();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Terminando thread principal.");
}