Pesquisar neste blog

13/07/2019

Threads usando com Java

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

Nenhum comentário: