Run Code  | API  | Code Wall  | Misc  | Feedback  | Login  | Theme  | Privacy  | Patreon 

jb12.0 threads.enums

//'main' method must be in a class 'Rextester'.
//Compiler version 1.8.0_111

import java.util.*;
import java.lang.*;

class Rextester
{  
    public static void main(String args[])
    {
        Signals signal = Signals.RED;
        System.out.println(signal);
        
        TraficLights tl = new TraficLights();
        Thread t = new Thread(tl, "trafic light");
        t.start();
        for(int i = 0; i<10; i++){
            signal = tl.getSignal();
            System.out.printf("%s:\t%s\twait time = %s\n", Calendar.getInstance().get(Calendar.MILLISECOND), signal, signal.getWaitTime());
            tl.waitChange();
        }
        tl.stop();
    }
}

enum Signals{
    RED(150), YELLOW(30), GREEN(500);
    
    private int _waitTime;
    
    public int getWaitTime(){
        return _waitTime;
    }
    
    Signals(int waitTime){
        _waitTime = waitTime;
    }
}

class TraficLights implements Runnable{
    private Signals _signal;
    private boolean _stop;
    private boolean _waiting = true;
    
    public void run(){
        while(!_stop){
            try{
            switch(_signal){
                case RED: Thread.sleep(_signal.getWaitTime()); break;
                case YELLOW: Thread.sleep(_signal.getWaitTime()); break;
                case GREEN: Thread.sleep(_signal.getWaitTime()); break;
            }
            }catch(InterruptedException e){
                System.out.println("error, interrupted sleep");
                System.out.println(e);
            }
            changeSignal();
            _waiting = false;
        }
    }
    
    synchronized private void changeSignal(){
        switch(_signal){
                case RED: _signal = Signals.YELLOW; break;
                case YELLOW: _signal = Signals.GREEN; break;
                case GREEN: _signal = Signals.RED; break;
            }
        notify();
    }
    
    synchronized public void waitChange(){
        try{
            while(_waiting) wait();
        }catch(InterruptedException e){
            System.out.println("error, interrupted wait");
            System.out.println(e);
        }
        _waiting = true;
    }
    
    public void stop(){
        _stop = true;
    }
    
    public Signals getSignal(){
        return _signal;
    }
    
    TraficLights(Signals signal){
        _signal = signal;
    }
    
    TraficLights(){
        _signal = Signals.RED;
    }
}
 run  | edit  | history  | help 0