张孝祥_交通灯管理系统小结

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


        巧妙的地方:1,把整个系统的逻辑路线抽取到只有4条;

                                               2,Road和Lamp通过String联系起来;

                                               3,把车流用集合描述

        在这个教程中还学到了一些新知识,Executors的用法,线程池(ExecutorService)和定时器(ScheduledExecutorService)的概念及用法。

//定义线程池及用法
ExecutorService pool = Executors.newSingleThreadExecutor();
		pool.execute(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i < 1000; i++) {
					try {
						// Thread.sleep((long) (Math.random()*10));
						Thread.sleep((new Random().nextInt(10) + 1) * 1000);
						transportation.add(Road.this.name + "--" + i);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		});
                  //定义定时器及其用法
		ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
		timer.scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				if (transportation.size() > 0) {
					boolean lighted = Lamp.valueOf(Road.this.name).isGreen();
					if (lighted) {
						System.out.println(transportation.remove(0)
								+ "  is traversing !");
					}
				}
			}
		}, 1, 1, TimeUnit.SECONDS);
	}


在写Lamp的类时,自己做了一些修改,用了switch语句表示相反的和下一个灯,如下:

public enum Lamp {
	S2N,S2W,E2W,E2S,
	N2S,N2E,W2E,W2N,
	S2E(true),E2N(true),N2W(true),W2S(true);
	
	private boolean isGreen;
	
	private Lamp(boolean isGreen){
		this.isGreen = isGreen;
	}
	private Lamp(){
	}
	
	private Lamp next(){
		switch(this){
		case S2N:
			return S2W;
		case S2W:
			return E2W;
		case E2W:
			return E2S;
		case E2S:
			return S2N;
		}
		return null;
	}
	
	private Lamp opposite(){
		switch(this){
		case S2N:
			return N2S;
		case S2W:
			return N2E;
		case E2W:
			return W2E;
		case E2S:
			return W2N;
		}
		return null;
	}
	
	public boolean isGreen(){
		return isGreen;
	}
	public void toGreen(){
		isGreen = true;
		if (this.opposite()!=null)
			this.opposite().isGreen = true;
		System.out.println(name() + " & "+ opposite().name() + " turn green oooo!");
	}
	public Lamp toRed(){
		System.out.println(name() + " & "+ opposite().name() + " turn red XXXX!");
		isGreen = false;
		if (this.opposite()!=null)
			this.opposite().isGreen =false;
		if(next()!=null)
			next().toGreen();
		return next();
	}
	
}


最终效果上和教程里是一样的。

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值