您的位置:首页 > 职场人生

黑马程序员 交通灯管理系统

2014-01-16 16:12 148 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训 期待与您交流!----------------------

 

关于交通灯管理系统的个人学习心得:

1. 分析面向对象的技巧:谁拥有数据,谁就对外提供操作这些数据的方法

面向对象的案例分析:

(1)人在黑板上画圆

对象:

person,blackboard,circle

画圆这个方法应该属于圆这个对象

因为画圆这个方法中必定会有圆心(x,y),半径(radius)

这些数据都来自于圆的属性。

(2)将2块石头磨成石刀,用石刀砍树得到木材,用木材做成椅子

对象:

stone

stoneKnife=KnifeFactory.createKnife(stone1,stone2)

tree

material=stoneKnife.cut(tree)

chair=ChairFactory.makeChair(material)

2. 局部内部类访问外部类的成员变量时的格式:

外部类名.this.成员变量名

3. ArrayList类中的remove方法的作用是移除指定位置上的元素并返回移除的这个元素

 E
remove(int index)
4. Executes是一个执行线程的工具类,真正的线程池接口是ExecutorService

5. ScheduledExecutorService 此接口的功能和Time/TimerTask类似,主要解决需要重复执行的任务

6. Executors.newSingleThreadExecutor().execute(command);

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

7. Executors.newScheduledThreadPool(corePoolSize).scheduleAtFixedRate(command, initialDelay, period, unit);

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

/**
* 路
* 此类的功能:通过增加车辆和减少车辆来模拟车移动的过程,故
* 车只需定义成一个字符串即可
* 一共有12个方向的车,在这12个方向中其中有4个方向是主要的
* 这4个方向分别是:
* S2N		S2W		E2W		E2S
* 这四个方向的相反方向是:
* N2S		N2E		W2E		W2N
* 4个右拐弯方向是:
* S2E		E2N		N2W		W2S
* 只有前4个主要方向上的灯有相反方向上的灯
* 也有下一个方向上的灯,这样做的目的是好控制
* 灯的亮与灭
* 假设4个右拐弯的灯是常绿的,这样做的目的是保证
* 每个方向上都有灯,这样路只关注自己所在前方上的灯
* 若灯是亮的则移除一辆车,路还要不停的产生车,还要
* 定时的检测自己所在方向的灯是否是亮的
*/
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Road {
//创建存储车辆的集合
private List<String> vehicle=new ArrayList<String>();

//每一个方向的名称
private String name;
public Road(String name){
this.name=name;

//车不停的上路和车穿过马路这些功能是互不影响的,所以要用多线程来完成各自的功能
Executors.newSingleThreadExecutor().execute(new Runnable(){
public void run(){
for(int x=1; x<1000; x++){
try {
Thread.sleep((new Random().nextInt(10)+1)*1000); //1-10s内产生一辆车
} catch (InterruptedException e) {
e.printStackTrace();
}
vehicle.add(Road.this.name+"_"+x); //内部类访问外部类成员变量:外部类.this.成员变量名
}
}
});

//定时的检测相应方向上的灯是否是亮的
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
if(vehicle.size()>0){//若路上有车则判断该方向上的灯是否是亮的,若是亮的则移除一辆车
boolean lighted=Lamp.valueOf(Road.this.name).isLigth();
if(lighted){
System.out.println(vehicle.remove(0)+" is traving."); //返回移除的车
}
}
}
},
1,
1,
TimeUnit.SECONDS
);

}

}

 

/**
* 灯
* 灯的个数是固定的所以定义成枚举
* 一共有12个方向故应该有12个方向的灯
* 灯有变亮和不亮的方法
*/
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 String opposite;
private String next;
private boolean lighted;
private Lamp(String opposite,String next,boolean lighted){
this.opposite=opposite;
this.next=next;
this.lighted=lighted;
}

//判断灯是否是亮的
public boolean isLigth(){
return this.lighted;
}

//让当前的灯变亮,若当前的灯有相反方向的灯,让当前灯的相反方向的灯变亮
public void light(){
this.lighted=true;
if(this.opposite!=null){
Lamp.valueOf(opposite).light();
}
System.out.println(name()+" is green.下面总共有6个方向可以看到汽车穿过");
}

//让当前的灯变灭,若当前的灯有相反方向的灯,让当前灯的相反方向的灯变灭;
//若当前灯有下一个方向上的灯,让下一个方向上的灯变亮
public Lamp blackOut(){
this.lighted=false;
if(this.opposite!=null){
Lamp.valueOf(opposite).blackOut();
}

Lamp nextLamp=null;
if(this.next!=null){
nextLamp=Lamp.valueOf(next);
System.out.println("绿灯由"+name()+"切换为------>"+next);
nextLamp.light();
}
return nextLamp;
}

}

 

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

/**
* 交通灯控制系统
* 定时的将灯由绿(亮)变红(灭),再由红变绿
*/
public class LampController {
private Lamp currentLamp;
public LampController(){
this.currentLamp=Lamp.S2N;
currentLamp.light();

Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
new Runnable(){
public void run(){
currentLamp=currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS
);

}
}

 

/**
* 测试类
* @author Administrator
*
*/
public class MainClass {

/**
* @param args
*/
public static void main(String[] args) {
//创建12个方向
String[] directors={"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};

//创建12条路
for(int x=0; x<directors.length; x++){
new Road(directors[x]);
}

//创建控制系统
new LampController();
}

}


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

详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: