Crie um semáforo (sinal de trânsito) usando Threads. O semáforo deve ficar verde por x segundos, depois brevemente amarelo seguido de y segundos na cor vermelha.
Resolução:
Enun CorSemafaro
/**
*
* @author HENRIQUE
*/
public enum CorSemafaro {
//VERDE, AMARELO, VERMELHO;
//opcional
VERDE(1000), AMARELO(300), VERMELHO(2000);//
private int tempoEspera;//
private CorSemafaro(int tempoEspera) {//
this.tempoEspera = tempoEspera;//
}
public int getTempoEspera() {//
return tempoEspera;//
}
}
Classe ThreadSemaforo
public class ThreadSemaforo implements Runnable{
private CorSemafaro cor;
private boolean parar;
private boolean corMudou;
public ThreadSemaforo() {
this.cor = CorSemafaro.VERMELHO;//inicia com vermelho
this.parar = false;
this.corMudou = false;
new Thread(this).start();//executa o metodo run
}
@Override
public void run() {
while(!parar){
try{
/*
switch (this.cor){
case VERMELHO: Thread.sleep(2000);break;
case AMARELO: Thread.sleep(300);break;
case VERDE: Thread.sleep(1000);break;
default:
break;
*/
Thread.sleep(this.cor.getTempoEspera());//opcional
this.mudarCor();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
private synchronized void mudarCor(){
switch (this.cor){
case VERMELHO:
this.cor = CorSemafaro.VERDE; break;
case AMARELO: this.cor = CorSemafaro.VERMELHO; break;
case VERDE: this.cor = CorSemafaro.AMARELO; break;
default:
break;
}
this.corMudou = true;
notify();//notifica a thread estiver esperando
}
public synchronized void esperaCorMudar(){
while(!this.corMudou){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
this.corMudou = false;
}
public synchronized void deligarSemafaro(){
this.parar = true;
}
public CorSemafaro getCor() {
return cor;
}
public boolean isParar() {
return parar;
}
}
Classe principal
public class Aplicacao1 {
public static void main(String[] args) {
ThreadSemaforo semafaro = new ThreadSemaforo();
for(int i= 0; i< 10; i++){
System.out.println(semafaro.getCor());
semafaro.esperaCorMudar();
}
}
}