黑马程序员---交通灯管理系统的总结与改进

本文介绍了一个交通灯管理系统的设计与实现,包括Road类、Lamp类和LampController类的详细设计,通过多线程和定时任务模拟真实世界的交通灯控制流程。

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

------------Android培训、Java培训、期待与您交流----------

交通灯管理系统设计与分析
 
Road类的分析与设计
 
每条路口上都会出现多辆车,路线上会随机增加车辆,在路口绿灯期间还要每秒钟减少一辆车
1) 设计一个road类表示路线,共有12条路线,就会产生12个road对象
2) 每条路线上随机增加新的车辆,增加到一个集合中保存
3) 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是的话把本路线集合中德第一辆车移除,即表示车穿过了路口。
具体实现代码如下:
/*
 * 1.每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表
 * 	  每个方向上的车辆集合。
 * 2.在Road对象的构造方法中启动一个线程每隔一个随机的时间想vehicles集合中增加
 *   一辆车
 * 3.在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,
 *   是则打印车辆集合并将集合中的第一辆车移出。
 * 
 */
package com.intel.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;
			ExecutorService pool = Executors.newSingleThreadExecutor();
			pool.execute(new Runnable() {
				public void run()
				{
					for(int i = 1 ; i < 500 ; i++)
					{
						try 
						{
							Thread.sleep((new Random().nextInt(10)+1)*1000);
						} 
						catch (InterruptedException e) 
						{
							e.printStackTrace();
						}
						vechicles.add(Road.this.name+"_"+i);
					}
				}
			});
			
			ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
			timer.scheduleAtFixedRate(new Runnable() {
				public void run()
				{
					if(vechicles.size() > 0)
					{
						boolean lightstatus = Lamp.valueOf(Road.this.name).lightStatus();
						if(lightstatus)
						{
							System.out.println("Vehicles in "+vechicles.remove(0)+" is traversing!!!");
						}
					}
				}
			}, 
			1, //initialDelay
			1, //period
			TimeUnit.SECONDS);//unit
		}
}
 
Lamp类的分析与设计
 
每条路线每隔一秒都会检查控制本路线的灯是否为绿灯,如果一个灯由绿变红时,应该将下一个方向的灯变绿
1) 设计一个lamp类来表示一个交通灯。每个交通等都在做红绿灯切换(改进后加入了黄灯),每个交通灯都要有变绿和变红的方法,且能自动切换
2) 对应12条路线要产生12个交通灯。右拐弯的路线可以不受灯的控制,但是为了让程序采用统一的处理方式,假设四个右拐弯等一直保持常量状态
3) 除了右拐弯方向的其他8条路线的灯,他们是两两成对出现的,可以归为四组。所以,在编程处理时,只要从这4组中各取出一个灯进行变化即可。
4) 无论在程序什么地方去获得某个方向的灯时,每次获得的都是同一个实例对象,所以lamp类改用枚举来做显示具有很大的方便性。
具体实现代码如下:
package com.intel.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 Lamp(String opposite, String next , boolean lightstatus)
	{
		this.opposite = opposite;
		this.next = next;
		this.lightstatus = lightstatus;
	}
	
	private Lamp()
	{
		
	}
	
	private boolean lightstatus;
	private String opposite;
	private String next;
	public boolean lightStatus()
	{
		return lightstatus;
	}
	
	public void lightOn()
	{
		this.lightstatus = true;
		if(opposite!=null)
		{
			Lamp.valueOf(opposite).lightOn();
		}
		System.out.println(name()+" lamp is green...Vehicles come from 6 directons...");
	}
	
	public Lamp lightOff()
	{
		this.lightstatus = false;
		if(opposite!=null)
		{
			Lamp.valueOf(opposite).lightOff();
		}
		
		Lamp nextLamp = null;
		if(next!=null)
		{
			nextLamp = Lamp.valueOf(next);
			System.out.println("Green lights "+name()+"/"+opposite.toString()+
					" ...are turning to... "+next+"/"+Lamp.valueOf(next).opposite.toString());
			nextLamp.lightOn();
		}
		return nextLamp;
	}
}

LampController类的分析与设计
1) 整个系统中只能有一套交通灯控制系统,所以LampController类最好是设计为单例模式,始终保持一个对象的存在。而别的类无法创建对象。
2) LampController的构造方法中要设定第一个为绿的灯
3) LampController对象的start方法中将当前的灯变绿,然后启动一个定时器,每个10秒将当前等变红和下一个灯变绿
4) 在当前灯由红变绿的过程中,现实中应该有一个黄灯的过度期,且在黄灯过度时,当前两个相应路口的车辆还应该是穿过状态,知道有绿灯变为红灯为止
运行结果下:
Vehicles in S2N_1 is traversing!!!
Vehicles in S2E_1 is traversing!!!
Yellow light in 3 Seconds...Vehicles still Traversing...
Vehicles in S2N_2 is traversing!!!
Vehicles in N2S_2 is traversing!!!
Vehicles in N2W_1 is traversing!!!
Vehicles in W2S_1 is traversing!!!
Vehicles in S2E_2 is traversing!!!
Vehicles in N2W_2 is traversing!!!
Green lights S2N/N2S ...are turning to... S2W/N2E
N2E lamp is green...Vehicles come from 6 directons...
S2W lamp is green...Vehicles come from 6 directons...
Vehicles in S2W_1 is traversing!!!
Vehicles in N2E_1 is traversing!!!

具体实现代码如下:
package com.intel.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.lightOn();
		
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable() {
			public void run() 
			{
				System.out.println("Yellow light in 3 Seconds...Vehicles still Traversing...");
				try
				{
					Thread.sleep(3000);
				}
				catch (InterruptedException e) 
				{
					e.printStackTrace();
				}
				currentLamp = currentLamp.lightOff();
			}
		},
		10, 
		10, 
		TimeUnit.SECONDS);
	}
}

MainClass类的编写
1) 用for循环创建出代表12条路线的对象
2) 接着获得LampController对象并调用其start方法。
 具体实现代码如下
 
package com.intel.traffic;

import java.awt.List;
import java.util.ArrayList;

public class MainClass 
{
	public static void main(String[] args) 
	{
		String[] directions = new String[]{"S2N","S2W","E2W","E2S",
				"N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
		
		new LampController();
		
		for(int i = 0 ; i < directions.length ; i++)
		{
			new Road(directions[i]);
		}
	}
}

------------Android培训、Java培训、期待与您交流----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值