交通灯管理系统

------- android培训、java培训、期待与您交流! ----------

一、需求

二、画图演示
三、分析
  • 大体过程:线路随机增加车,且本线路灯为绿,车通行。所以关键对象就是线路和灯。
  • 线路:
    • 线路的作用是:产生车辆、判断灯、移除车辆。
    • 数量:共12条,12个线路对象。
    • 每条线路随机增加新车辆,装入集合
    • 线路每秒检查灯,是绿灯,头一辆车通过,移出集合。

 

package com.isoftstone.interview.traffic;

import java.util.List;
import java.util.ArrayList;
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 vehicles=new ArrayList();
	private String name =null;
	public Road( String name)
	{
		this.name = name;
		//下面开启一个线程,功能是:1-10秒出现一辆车,接着添加进集合。
		ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable(){

			@Override
			public void run()
			{
				// TODO Auto-generated method stub
				for (int i = 0; i < 1000; i++)
				{
					try
					{
						Thread.sleep((new Random().nextInt(10)+1)*1000);
						
					} catch (InterruptedException e)
					{
						// TODO Auto-generated catch block
						e.printStackTrace();
					}					
					vehicles.add(Road.this.name+"_"+i);//访问外部类的成员变量:外部类名.this.变量名	
					
				}
			}
			
		});
		//下面定义一个调度线程,固定频率,移除集合中的首辆车,返回:路名+编号
		ScheduledExecutorService timer= Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){

					@Override
					public void run()
					{
						
						// TODO Auto-generated method stub
						//Lamp lamp = Lamp.valueOf(direction);
						if(vehicles.size()>0)
						{
							//这条路上的灯是否是亮的。
							boolean lighted = Lamp.valueOf(Road.this.name).isLighted();				
			
							if (lighted)//有车,绿灯,则通行
							{
								
								System.out.println(vehicles.remove(0)+"is traversing!");
							}
						}														
					}}, 
				1, 
				1, 
				TimeUnit.SECONDS
				);
		
	}
	
}


灯:

  • 灯的作用是:当前状态、变红、变绿。
  • 数量:12个灯,
    • 有4个(右转)是长亮的。
    • 其他8条是成对存在的,灯的颜色变化相同。
    • 综上,不同的只有4组灯。只要控制好这四组灯即可。
  • 控制: 怎么控制四组灯,依次轮转变亮呢?
    • 自己与对面的灯一块变化,需要一个变量记住。
    • 记住自己后面的灯,也需要一个变量。尾巴记住首位组成一个循环。
    • 由于灯的实例每个方向只有一个,用枚举可以带来很大的方便,永远都只有代表12个方向的灯的实例对象。
package com.isoftstone.interview.traffic;

public enum Lamp
{	//只有第一行四个灯是重要的,南向上、向左。东向上、向左。只要控制好这四个灯的循环,所有灯就被控制了。
	//第一行第一个参数给String,可以转成Lamp。直接Lamp类型不行,因为作为参数的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 lighted)
	{
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	
	private boolean lighted;//灯的状态,true为红,false为暗
	private String opposite;//对面的灯。类型为String可以恢复为Lamp,
	private String next;//下一个灯。
	
	public boolean isLighted() //灯是否亮?
	{
		return lighted;
	}
	public void light()//变绿方法
	{
		this.lighted = true;
		if(opposite != null)//对面的灯为null,不能有对应的灯接着回来找我了,不让会死循环
		{
			Lamp.valueOf(opposite).light();//对面也跟着变绿			
		}
		System.out.println(name()+"lamp is green,下面共应该有6个方向能看到汽车通过!");
		
	}
	public Lamp blackOut()//变红方法。
	{
		this.lighted = false;
		if(opposite != null)//对面的灯为null,不能有对应的灯接着回来找我了,不让会死循环
		{
			Lamp.valueOf(opposite).blackOut();//对面也跟着变红		
		}
		//当前灯灭,则把下一个灯变亮作为当前灯,返回。
		//Lamp nextLamp = Lamp.valueOf(next);
		Lamp nextLamp = null;
		if(next != null)
		{
			nextLamp = Lamp.valueOf(next);
			//Lamp.valueOf(next).light();
			System.out.println("绿灯从"+name()+"---->切换为"+next);
			nextLamp.light();
		}
		return nextLamp;
	}
}


灯控制器类

  • 这个类主要是控制灯的颜色变化。
  • 每过10秒钟就改变当前灯的颜色,灯的变红方法应该返回下一个灯,接着下一个灯作为当前灯。
  • 定时让当前的绿灯变红。
package com.isoftstone.interview.traffic;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class LampController
{
	private Lamp currentLamp;
	public LampController()
	{
		//初始化灯并且为绿(亮light)
		currentLamp = Lamp.S2N;
		currentLamp.light();
		
		//建一个定时器,每过一段时间,让当前的灯变红,下一个灯变绿。
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(
				new Runnable(){
					public void run()
					{
						//当前灯变红,返回值为下一个灯,下一个灯作为当前的灯。
						System.out.println("来啊");
						currentLamp = currentLamp.blackOut();						
					}}, 
				10, 
				10, 
				TimeUnit.SECONDS);
		
		

		
		
	}
}


MainClass

  • main()所在。
  • 创建12条路线。
  • 创建灯控制器对象,定时器可以放在构造函数,对象建立任务执行。

 

package com.isoftstone.interview.traffic;

public class MainClass
{

	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		//创建12条路线对象,和1个控制器。
/*		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);*/
		String [] directions = new String []
		{
				"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"		
		};	
		
		for (int i = 0; i < directions.length; i++)
		{
			new Road(directions[i]);
		}
		
		new LampController();
	}

}


 

 

------- android培训、java培训、期待与您交流! ----------

你可能感兴趣的:(交通灯管理系统)