黑马程序员:交通灯管理系统分析及代码实现

本文介绍了使用Java枚举实现交通灯管理系统,包括灯的状态管理、灯控制器和路的逻辑。系统通过线程池定时切换灯的状态,模拟车辆的增加和减少,确保在绿灯时车辆可以通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------交通灯管理系统

对象分析:


控制器

对象的变量和方法分析:

变量:车
方法:增加、减少车辆


变量:12种不同路线的灯,其中向右转的4条路线的灯看成永远是绿灯
方法:开灯(开灯的时候需开启相对的灯)、关灯(关灯的时候要开启下一个灯,还需返回下一个灯,因为在控制器中有一个固定频率的转换灯状态的方法,需要获得下当前灯(即上面说的下一个灯))
因为是固定的12种不同路线的灯,所以这里需定义为枚举类
剩下的8种不同路线的灯因为是相对的关系,所以可以看成是4组等,开灯的时候若有相对的等,则开启

控制器
方法:启动一个线程池,根据固定的频率变换灯的状态


Lamp:灯
/*
 * 灯
 * 共12种路线,即12种灯,向右转这种特殊方式把他看成绿灯,一直可通行
 * 另外8种灯是相对的,可以看成是4组,当灯亮时,对应的灯也亮,关闭也是同理
 * 灯关闭的时候,下一个路口的等就要变亮
 * 变亮=绿灯
 * 关闭=红灯
 * 这里不考虑黄灯
 */
package cn.itcast.Mr_Zhang.traffic;


public enum Lamp {
	S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",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 boolean lighted;
	//相对应的灯
	private String opposite;
	//下一个灯
	private String next;
	private Lamp(String opposite, String next, boolean lighted){
		this.opposite=opposite;
		this.next=next;
		this.lighted=lighted;
	}
	
	//检查灯的状态
	public boolean isLighted(){
		return lighted;
	}
	
	//亮灯操作,若存在相对的等,则相对的等也需要亮灯
	public void light(){
		this.lighted=true;
		if(opposite!=null){
			Lamp.valueOf(opposite).light();			
		}
		System.out.println(name()+"变为绿灯,共有6个方向可以通行");
	}
	//关灯操作,关闭此等后需要吧下一个灯点亮,这里需要返回下一个灯,因为在LampController中,每10秒关闭灯,开启下一个灯,需要将nextLamp赋值给currentLamp
	public Lamp closeLight(){
		this.lighted=false;
		if(opposite!=null){
			Lamp.valueOf(opposite).closeLight();
		}
		Lamp nextLamp = null;
		if(next!=null){
			nextLamp=Lamp.valueOf(next);
			System.out.println(name()+"灯变红,下一个灯:"+next+"变绿灯");
			nextLamp.light();
		}
		return nextLamp;
			
	}
	
}

LampController:灯控制器
package cn.itcast.Mr_Zhang.traffic;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


public class LampController {
		private Lamp currentLamp;
		public LampController(){
			currentLamp = Lamp.S2N;
			currentLamp.light();
			//每10秒关闭当前灯,开启下一个灯
			ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
			timer.scheduleAtFixedRate(
					new Runnable(){
						public void run(){
//							closeLight方法返回的Lamp赋值给currentLight
							currentLamp = currentLamp.closeLight();
						}
					}, 
					15, 
					15, 
					TimeUnit.SECONDS);
			
		}
		
	
}

Road:路
/*
 * 路的功能:
 * 随即增加车辆,定时减少车辆,把车辆看成是路中的数据,从而把车辆存储到集合中
 * 因为在增加和删除过程中,需要有延时的效果,所以在构造函数中需要吧该执行代码放入到一个线程池中
 * 让另一个线程执行,不然的话,这个对象一直创建不起来,创建的时候还在等待。
 */
package cn.itcast.Mr_Zhang.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> vehicles = new ArrayList<String>();
	private String name;


	public Road(String name) {
		this.name = name;
		// 模拟在路上随机增加1000辆车,因为不可能等创建完1000辆车之后才检查灯的状态,所以这里需要创建单独的线程执行
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable() {
			public void run() {
				for (int i = 1; i < 1000; i++) {
					try {
						Thread.sleep((new Random().nextInt(10) + 1) * 200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					vehicles.add(Road.this.name + '_' + i);
				}
			}
		});


		// 每隔1秒检查是否是绿灯,若是绿灯,则汽车通过,即减少一辆汽车
		ScheduledExecutorService schedulePool = Executors
				.newScheduledThreadPool(1);
		schedulePool.scheduleAtFixedRate(new Runnable() {
			public void run() {
				boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
				if (lighted) {
					System.out.println(vehicles.remove(0) + " is through");
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
	}
}

RunTraffic:启动模拟交通灯管理系统
package cn.itcast.Mr_Zhang.traffic;
public class RunTraffic {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] roads = new String[] { "S2N", "S2W", "E2W", "E2S", "N2S",
				"N2E", "W2E", "W2N", "S2E", "E2N", "N2W", "W2S" };
		
		// 生成12个方向的路线
		for (int i = 0; i < roads.length; i++) {
			new Road(roads[i]);
		}


		// 产生交通灯系统
		new LampController();
	}


}



---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.youkuaiyun.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值