交通灯具备 灯 。方向。路径 灯:是唯一的只有红绿,不考虑黄灯,所以用枚举定义灯,只给出两个对象。 - public enum Lemp
- {
- RED,GREED;//定义两个固定对象
- public Lemp getNext()//换灯方法
- {
- return this==RED?GREED:RED;
- }
- public String toString()
- {
- return this==RED?"红灯":"绿灯";
- }
- }
复制代码方向:总共四个方向,东南西北,每个方向都已两盏灯,一盏控制相对方向的直行灯,一盏控制右侧的拐弯灯。 - enum Direction
- {
- //初始化灯,南北两路直行灯为绿灯
- N(Lemp.GREED,Lemp.RED),
- S(Lemp.GREED,Lemp.RED),
- W(Lemp.RED,Lemp.RED),
- E(Lemp.RED,Lemp.RED);
-
-
- private Lemp left,reght;
-
- private Direction(Lemp left,Lemp reght)//每条路应该有两盏灯,一盏表示直行,一盏表示拐弯
- {
- this.left=left;
- this.reght=reght;
- }
- public void setLeft()//换拐弯灯
- {
- this.left=left.getNext();
- }
- public void setReght()//换直行灯
- {
- this.reght=reght.getNext();
- }
- public Lemp getLeft() //获取拐弯灯
- {
- return left;
- }
- public Lemp getReght() //获取直行灯
- {
- return reght;
- }
- public String toString()
- {
- return this==N?"南面":this==S?"北面":this==E?"西面":"东面";
- }
-
- }
复制代码车辆:具备来的方向和将要去的方向,与判断去向的某一盏灯,将这些信息都封装在车里。 - public enum Car
- {
- //车类,每辆车具备 去向与来的方向,和捕捉某条路径的对应灯
- N_S(Direction.N,Direction.S,LR.R),N_E(Direction.N,Direction.E,LR.L),
- S_N(Direction.S,Direction.N,LR.R),S_W(Direction.S,Direction.W,LR.L),
- E_W(Direction.E,Direction.W,LR.R),E_S(Direction.E,Direction.S,LR.L),
- W_E(Direction.W,Direction.E,LR.R),W_N(Direction.W,Direction.N,LR.L);
- private LR lr;
- private Direction x,y;//x=来的方向 y=将要去的方向
- private Car(Direction x,Direction y,LR lr)
- {
- this.x=x;
- this.y=y;
- this.lr=lr;
- }
- public String toString()
- {
- return x+"开往"+y;
- }
- public Direction getX()
- {
- return this.x;
- }
- public Direction getY()
- {
- return this.y;
- }
- public LR getLR()
- {
- return this.lr;
- }
- }
- enum LR//左右枚举
- {
- L,R;
- }
复制代码路径:每条路径就相当于一个容器,有两条线程,一条负责产生车辆,另一条将消费车,把车从指定的容器里取出,(需要在指定灯为绿的情况下才能执行)。主要用于模拟车辆行驶。 - public class Path
- {
- private List<String> path;//存储容器
- private Car car;//汽车
- private int connt=1;//计数器
- Path(Car car)//每条路作为容器,在构造时,应该存储对应信息的车
- {
- this.car=car;
- this.path=new ArrayList<>();
- init();
- PDCar();
- }
- private void init()//作为一条线程,在路径产生时,每间隔五秒将会产生一两对应路径车
- {
- Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(
- new Runnable(){
- public void run()
- {
- addCar("第"+(Path.this.connt++)+"辆从"+Path.this.car+"的车");
- }
- },
- 0,
- 5,
- TimeUnit.SECONDS);
- }
- private synchronized void addCar(String Carname)//存入集合
- {
- System.out.println(Carname+"进入十字路口的"+this.car.getX());
- this.path.add(Carname);
- }
-
- private void PDCar()//对车判断灯拐弯的这则判断左灯,直行则判断右灯
- {
- Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(
- new Runnable(){
- public void run()
- {
- if(Path.this.car.getLR()==LR.L)
- {
- if(getDirL()==Lemp.GREED)
- delCar();
- }else
- {
- if(getDirR()==Lemp.GREED)
- delCar();
- }
- }
- },
- 0,
- 1,
- TimeUnit.SECONDS);
- }
- private Lemp getDirR()
- {
- return this.car.getY().getReght();
- }
- private Lemp getDirL()
- {
- return this.car.getY().getLeft();
- }
- private synchronized void delCar()
- {
- if(Path.this.path.size()>0)
- System.out.println(Path.this.path.remove(0)+"开往"+car.getY()+"耗时1秒");
- else System.out.println("目前"+car.getX()+"没有车向"+car.getY()+"行驶");
- }
-
-
- }
复制代码交通灯管理器,具备东南西北四个方向与路径,还有控制灯的方法,都封装都这个枚举里 - import java.util.concurrent.Executors;
- import java.util.concurrent.TimeUnit;
- enum trafficRG //交通灯管理,将路径与车辆路径灯都组装在一起
- {
- TRAFFIC_SIGNAL;
-
- public void open()//开启交通灯
- {
- manAge();
- Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(
- //每隔十秒捕捉每条路的两盏灯当前新信息
- new Runnable(){
- public void run()
- {
- System.out.println("南面--拐弯灯="+Direction.N.getLeft()+"--"+"直行灯="+Direction.N.getReght());
- System.out.println("北面--拐弯灯="+Direction.S.getLeft()+"--"+"直行灯"+Direction.S.getReght());
- System.out.println("东面--拐弯灯="+Direction.W.getLeft()+"--"+"直行灯="+Direction.W.getReght());
- System.out.println("西面--拐弯灯="+Direction.E.getLeft()+"--"+"直行灯="+Direction.E.getReght());
- }
- },
- 0,
- 10,
- TimeUnit.SECONDS);
- addPath();
-
- }
- private void manAge()//设置灯的变化时间,(实在找不出规律,写的整体自己都看不下去)
- {
- Executors.newCachedThreadPool().execute(new Runnable()
- {
- public void run()
- {
- Direction.N.setLeft();Direction.S.setLeft();
- Direction.N.setReght();Direction.S.setReght();
-
- try{Thread.sleep(10000);}catch(Exception e){}
-
- Direction.N.setReght();Direction.S.setReght();
- Direction.E.setLeft();Direction.W.setLeft();
-
- try{Thread.sleep(10000);}catch(Exception e){}
-
- Direction.E.setLeft();Direction.W.setLeft();
- Direction.E.setReght();Direction.W.setReght();
-
- try{Thread.sleep(10000);}catch(Exception e){}
-
- Direction.E.setReght();Direction.W.setReght();
- Direction.N.setLeft();Direction.S.setLeft();
- }
- });
- }
- private void addPath()//八条路径对应指定路径车
- {
- new Path(Car.N_S);
- new Path(Car.N_E);
- new Path(Car.S_N);
- new Path(Car.S_W);
- new Path(Car.W_E);
- new Path(Car.W_N);
- new Path(Car.E_W);
- new Path(Car.E_S);
- }
- }
- 主程序:调用交通灯管理系统
- public class Main {
- public static void main(String[] args)
- {
- trafficRG.TRAFFIC_SIGNAL.open();//建立交通灯,并开启
- }
- }
复制代码
|