用java模拟交通灯系统实现

来源:互联网 发布:mac联网后无法上网 编辑:程序博客网 时间:2024/05/23 19:05

交通灯管理系统

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下:

Ø 异步随机生成按照各个路线行驶的车辆。

例如:

       由南向而来去往北向的车辆 ---- 直行车辆

       由西向而来去往南向的车辆 ---- 右转车辆

       由东向而来去往南向的车辆 ---- 左转车辆

       。。。

Ø 信号灯忽略黄灯,只考虑红灯和绿灯。

Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制。

Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑。

注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆。

Ø 每辆车通过路口时间为1秒(提示:可通过线程Sleep的方式模拟)。

Ø 随机生成车辆时间间隔以及红绿灯交换时间间隔自定,可以设置。

Ø 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。

分析:

      这个题目中涉及到了三个对象交通灯Lamp、道路Lamp、汽车Car,基于面向对象的设计思想,可以想到Lamp类中具有交通的状态信息,交通灯的状态,交通灯变红、变绿的方法,通过自己的设计经验,自然可以想到我们的这个类最好的方法是使用枚举来实现;而Road类中,在路上跑的是汽车,所以Road类中具有一个承装汽车的集合,还具有产生汽车的方法和汽车通过路口以后移除汽车的方法。汽车类在我们的这个模拟系统中,是不需要设计的,我们使用一个String的字符串来代替汽车,从而简化我们的操作。

      此外还需要一个控制交通灯变化的一个控制类,以及一个MainClass。

      通过Executors类的静态方法来产生线程和定时器控制,比jdk1.5以前的Thread类更为高效一些。


项目源码如下:

Lamp类

package com.wj.interview.traffic;
/**
 *
 * @author wJing
 * 交通灯,自然想到使用枚举来实现
 */
public enum Lamp {
    /**
     * S,N,W,E表示南,北,西,东
     * S2N表示从南往北直行,S2W表示从南往西左转,以此类推
     */
    S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("","",false),
    N2S(null, null, false),N2E(null, null, false),W2E(null, null, false),W2N(null, null, false),
    S2E(null, null, true),E2N(null, null, true),N2W(null, null, true),W2S(null, null, true);
    
//    private Lamp() {
//        
//    }
    
    private Lamp(String opposite, String next, boolean lighted) {
        this.opposite = opposite;
        this.next = next;
        this.lighted = lighted;
    }
    //灯的状态
    private boolean lighted;
    //对应的灯,相对方向的
    private String opposite;
    //下一个灯
    private String next;
    
    //获得灯的状态
    public boolean isLighted() {
        return lighted;
    }
    //灯亮
    public void light() {
        this.lighted = true;
        if(opposite != null) {
            Lamp.valueOf(opposite).light();
        }
        System.out.println(name() + " lamp is green 下面总共应该有6个方向能看到汽车通过!");
    }
    //灯变红,并返回下一次的灯
    public Lamp blackOut() {
        this.lighted = false;
        if(opposite != null) {
            Lamp.valueOf(opposite).blackOut();
        }
        Lamp nextLamp = null;
        if(next != null) {
            nextLamp = Lamp.valueOf(next);
            System.out.println("绿灯从" + name() + "---->切换为" + next);
            nextLamp.light();
        }
    //    System.out.println("下一盏灯的名字:" + nextLamp.name());
        return nextLamp;
    }
}
LampController类

package com.wj.interview.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
 *
 * @author wJing
 * 交通灯的控制器
 */
public class LampController {
    private Lamp currentLamp;
    
    public LampController() {
        currentLamp = Lamp.S2N;
        currentLamp.light();
        
        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(
                new Runnable() {

                    @Override
                    public void run() {
                        currentLamp = currentLamp.blackOut();
                    }},
                10,
                10,
                TimeUnit.SECONDS);
    }
    
}
Road类
package com.wj.interview.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Road {
    //定义一个汽车的集合
    private List<String> vechicles = new ArrayList<String>();
    
    private String name = null;
    
    public Road(String name) {
        this.name = name;

        //jdk1.5的线程Executors,要比以前的优化一些
        //必须把创建车的方法放到一个线程中,不然构造方法会阻塞
        //随机产生车
        ExecutorService pool = Executors.newSingleThreadExecutor();
        pool.execute(new Runnable() {

            @Override
            public void run() {
                for(int i = 1; i < 1000; i++) {
                    try {
                        //随机产生车,1-10内随机产生一辆车
                        Thread.sleep((new Random().nextInt(10) + 1) * 1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                        //或者将构造方法改为:Road(final String name)
                    vechicles.add(Road.this.name + "_" + i);
                    
                }
            }});
        //如果车通过了路口,则把车从集合中移除
        ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
        timer.scheduleAtFixedRate(
                new Runnable() {

                    @Override
                    public void run() {
                        if(vechicles.size() > 0) {
                            boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
                            if(lighted) {
                                System.out.println(vechicles.remove(0) + " is traversing ");
                            }
                        }
                    }},
                1,
                1,
                TimeUnit.SECONDS);
        
    }

}
MainClass类
package com.wj.interview.traffic;

public class MainClass {

    public static void main(String[] args) {
        //十二盏灯的名字
        String[] direction = new String[] {
            "S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"    
        };
        //十字路口,十二盏灯,也就是十二条路
        for(int i = 0; i < direction.length; i++) {
            new Road(direction[i]);
        }
        //启动控制器
        new LampController();
    }

}

0 1
原创粉丝点击