------- "http://www.itheima.com"android培训"http://www.itheima.com"java培训、期待与您交流! ----------
/*
交通灯管理系统
一,需求分析:车属于路,题中不需要体现出车是如何过马路的。所以完全可以将车设计为由路对象控制的一个字符串,将路定义为一个集合,车字符串表示
new Runnable(){
代码实现},1,1,TimeUnit.SECONDS);
*/
package com.isoftstone.interview.traffic;
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 {
//定义交通工具集合
private List
//初始化路的名字
private String nameString=null;
public Road(String name){
this.name=name;
//创建线程池
ExecutorService pool=Executors.newSingleThreadExecutor();
//创建实现类
pool.execute(new Runnable(){
public void run() {
for (int i = 1; i < 10000; i++) {
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);//随机产生1-10秒的随机数
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//内部类调用外部类的成员变量
vehicles.add(Road.this.nameString+"_"+i);
}
}
});
//定义一个定时器
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run() {
if(vehicles.size()>0){
boolean lighted=Lamp.valueOf(Road.this.nameString).isLighted();
if (lighted) {
System.out.println(vehicles.remove(0)+"is traversing");
}
}
},
1,
1,
TimeUnit.SECONDS
);
}
}
/*2,写Lamp对象:
8,当编写好了灯对象之后就可以在路对象中确定每一条路对应的自己名字相同的灯了;当灯控制器转换了灯的状态之后路的定时器方法就能检查到这一变化并作出停止放车过路的动作
*/
//由于行车路线只有12条,用枚举来实现。
package com.isoftstone.interview.traffic;
public enum Lamp {
//2代表to,E代表东 S代表南,N代表北,W代表西,
//设置灯的变动,车的走向
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.oppositeLamp=opposite;
this.nextString=next;
this.lighted=lighted;
}
//无参构造方法
private Lamp () {
}
//灯的状态
private boolean lighted;
//对面的灯
private String oppositeLamp;
//下一个灯
private String nextString;
//get方法返回灯的状态
public boolean isLighted() {
return lighted;
}
//灯亮
public void light() {
this.lighted=true;
if (oppositeLamp!=null) {
Lamp.valueOf(oppositeLamp).light();//返回枚举对象
}
System.out.println(name()+"lamp is green .下面可以看到六个方向的汽车穿过");
}
//灯灭并返回下一个灯
public Lamp blackOut() {
this.lighted=false;
if (oppositeLamp!=null) {
Lamp.valueOf(oppositeLamp).blackOut();//返回枚举对象
}
Lamp nextLamp=null;
if (nextString!=null) {
nextLamp=Lamp.valueOf(nextString);
System.out.println("绿灯从"+name()+"--->切换为"+nextString);
nextLamp.light();
}
return nextLamp;
}
}
2,控制器每过一段时间就会让当前的主灯熄灭并得到下一个主灯并点亮它,此功能需要构造一个定时器
*/
//交通灯控制
public class LampController {
private Lamp currentLamp;
public LampController(){
//LampController构造方法中要设定第一个为绿的灯,所以刚开始让由南向北的灯变绿;
currentLamp = Lamp
currentLamp.light();
//每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿
//LampController对象的start方法中将当前灯变绿,然后启动一个定时器,每隔10秒将当前灯变红和将下一个灯变绿
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable(){
public void run(){
System.out.println("车来了");
currentLamp = currentLamp.blackOut();
}
},
10,
10,
TimeUnit.SECONDS);
}
}
/*
4,写主方法时要考虑:2.new一个控制器对象,这样交通灯就开始工作,主灯路上的车就开始过路口,程序开始循环;
*/
public class MainClass
{
public static void main(String[] args)
{
//用for循环创建出代表12条路线的对象
String [] directions = new String[]
{
"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"
};
for(int i=0;i
{
new Road(directions[i]);
}
//获得LampController对象并调用其start方法,产生整个交通灯系统
new LampController();
}
------- "http://www.itheima.com"android培训"http://www.itheima.com"java培训、期}与您交流! ----------