黑马程序员--第二十七天:交通灯系统

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

 

 

//总体上减少了Lamp枚举的2个成员变量和2个方法以及test类的一个数组。
//LampController 提取了一个lightNextGroup()方法。

package com.itheima.trafficlamp;

public class Test {//该类减少一个数组。

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("Start");
		Lamp[] lamps = Lamp.values();
		new LampController();
		
		for(Lamp lamp : lamps){
			new Road(lamp);
		}
	}
}


package com.itheima.trafficlamp;

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 {//模拟车辆的增加和减少进行了提取

	List<String> vehicles = new ArrayList<String>();
	Lamp vName = null;
	
	public Road(Lamp name){
		vName = name;
		addVehicles();
		removeVehicles();
	}


	private void removeVehicles() {//模拟车辆减少
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				if((!vehicles.isEmpty())&& vName.isLighted())
				System.out.println(vehicles.remove(0)+" is traversing");
			}
		}, 1, 1, TimeUnit.SECONDS);
	}
	
	
	private void addVehicles() {//模拟增加车辆
		ExecutorService addV = Executors.newSingleThreadExecutor();
		addV.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(vName+" ::: "+i);
				}
			}
		});
	}
}


package com.itheima.trafficlamp;

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

public class LampController {//该类提取了一个 lightNextGroup()方法。

	int group = 0;
	Lamp[] lamps = Lamp.values();
	
	public LampController(){
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				lightNextGroup();
			}
		}, 0, 10, TimeUnit.SECONDS);
	}
	
	public void lightNextGroup(){//控制当前组的灯变成红的,下一组灯变为亮的。
		//当前组设为false;
		lamps[group = group%8].setLighted(false);
		lamps[group+1].setLighted(false);
		//下一组设为true;
		group = group+2;
		System.out.println("Lamps of "+lamps[group] +" and "+ lamps[group+1]+" turned to green");
		lamps[group].setLighted(true);
		lamps[group+1].setLighted(true);
	}
}


package com.itheima.trafficlamp;

public enum Lamp {//对Lamp 这个枚举进行了优化,与张孝祥老师的相比 该枚举省去了 
	//opposite 灯,next灯,以及light()方法 和 blackOut()方法。
	S2N___A,N2S___A,//groupA, controlled by controller
	S2W___B,N2E___B,//groupB, controlled by controller
	W2E___C,E2W___C,//groupC, controlled by controller
	W2N___D,E2S___D,//groupD, controlled by controller
	S2E___R(true),E2N___R(true),N2W___R(true),W2S___R(true);
	//groupR, turns right, not controlled by controller, whose lights are always green.
	
	private boolean lighted = false;
	
	public boolean isLighted() {
		return lighted;
	}

	public void setLighted(boolean lighted) {
		this.lighted = lighted;
	}

	Lamp(){};
	
	Lamp(boolean lighted){
		this.lighted = lighted;
	}
}

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值