黑马程序员 java 面试之交通信号灯

                           ----------- android培训java培训、java学习型技术博客、期待与您交流! --------

/*
需求:交通灯。
分析:每条道路的车都只要看直行和左转。
所以,要考虑的道路就只有四条,其他的都一样。
道路上的车和灯都是在变化,可以定义定时器来完成。


*/
class Road
{
	//每一条路可以看成一个集合,集合里有各种车,定时器每隔1秒产一辆车。
	private List<String> list = new ArrayList<String>();
	private name;
	Road(String name)
	{
		this.name = name;
		ExecutorService pool = Executors.newSigleThreadExecutor();
		pool.execute(new Runnable(){
			public void run()
			{
				for(int x = 0; x < 100 ; x++)
				{
					try
					{
						Thread.sleep((new Random().nextInt(10) + 1) * 1000);
					}
					catch (Exception e)
					{
						System.out.println(e.toString());
					}
					list.add(Road.this.name + "" + x);//启动一个线程,控制出现的车数。
				}
			}
		});
		 ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);//出现的间隔。
		 timer.scheduleAtFixedRate(
			new Runnable()
			 {
				public void run(){
					if(list.size() > 0)
					{
						boolean light =Lamp.valueOf(Road.this.name).isLighted();
						if(light)
							System.out.println(list.remove(0)+ "cheleile");
					}	
				}
			 }, 
			 1,
			 1, 
			 TimeUnit.SECONDS)
	}
}
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(){}
	private Lamp(String opposite)
	{
		this.opposite = opposite;
	}
	private Lamp(String opposite,String next,boolean lighted)
	{
		this.opposite = opposite;
		this.next = next;
		this.lighted = lighted;
	}
	public boolean isLigthed()
	{
		return lighted;
	}
	public void light()//出现的灯。
	{
		this.lighted = true;
		if(opposite != null)
			Lamp.valueOf(opposite).light();//反向的灯。
	}
	public Lamp blackOut()//下一个灯。
	{
		this.lighted = false;
		if(opposite != null)
			Lamp.valueOf(opposite).blackOut();
		Lamp nextLamp = null;
		if(next != null)
			nextLamp = Lamp.valueOf(next);
			Lamp.valueOf(next).light();
		return nextLamp;
	}
}
class LampController  //定时器,每隔10秒将当前灯变红和将下一个灯变绿。
{
	private Lamp currentLamp;
	public LampController()
	{
		currentLamp = Lamp.S2N;
		currentLamp.light();
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable()
			{
				public void run()
				{
					currentLamp = currentLamp.blackOut();
				}
			} ,
			10,
			10,
			TimeUnit.SECONDS)
	}
}
class Function  //主程序入口。
{
	public static void main(String[] args)
	{
		String[] dirRoads = {"S2N","S2W","E2W","E2S",
							"N2S","N2E","W2E","W2N",
							"S2E","E2N","N2W","W2S"};
		for( String dirRoad : dirRoads)
			new Road(dirRoad);
		new LampController();
	}
}


                          ----------- android培训java培训、java学习型技术博客、期待与您交流! -----------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值