package itheima.com.tracffic;
/**Road类
*
* 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
* 每条路线上随机增加新的车辆,增加到一个集合中保存。
* 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
*
*
*
* **/
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<String> vechicles = new ArrayList<String>();
//路的名字
private String name = null;
// cunstroctor
public Road(String name) {
this.name = name;
// 用线程池,模拟车辆随机上路的过程
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep((new Random().nextInt(10) + 1) * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < 1000; i++) {
vechicles.add(Road.this.name + "_" + i);
}
}
});
// 用调度池 创建一个定时器,每隔1秒检查灯的状态,若果为绿灯则弄走一辆车
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
if(vechicles.size()>0){
boolean lighted=true;
if(lighted){
System.out.println(vechicles.remove(0)
+ " is traversing !");
}
}
}},
1,//过多长时间开始前面的线程
1,//时隔多少时间再干前面是事
TimeUnit.SECONDS);//时间单位
}
}
package itheima.com.tracffic;
/**等类Lamp
* 每个Lamp元素代表一个方向上的灯,总共有12个方向,所有总共有12个Lamp元素。
* 有如下一些方向上的灯,每两个形成一组,一组灯同时变绿或变红
* **/
public enum Lamp {
// 北往南 同方向 南往北
N2S("S2N", "E2W", false),
//北向南
S2N(null, null, false),
// 东往西,同方向西往东
E2W("W2E", "E2S", false),
//西向东
W2E(null, null, false),
// 东往南,西往北
E2S("W2N", "S2W", false),
//西往北
W2N(null, null, false),
// 南往西,北往东
S2W("N2E", "N2S", false),
//北往东
N2E(null, null, false),
// 右转弯4个灯,状态为常绿
N2W(null, null, true), W2S(null, null, true), S2E(null, null, true), E2N(
null, null, true);
// 当前灯的状态
private boolean lighted;
// 与当前方向同时为绿的对应方向
private String opposite;
// 当前等变红时,下一个绿灯
private String next;
public boolean isLighted() {
return lighted;
}
private Lamp(String opposite, String next, boolean lighted) {
this.lighted = lighted;
this.opposite = opposite;
this.next = next;
}
/** 当某个灯变绿时,它当前方向对应的方向也该为绿 */
public void light() {
this.lighted = true;
if (opposite != null) {
// 把当前字符串变成枚举
Lamp.valueOf(opposite).light();
}
//返回name()当前枚举对象的名字,(Lamp.name();返回当前枚举的字符串
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}
/** 当某个等变红时它的对应的等也要变红,并把下一个等变绿 **/
public Lamp blackOut() {
// 把绿灯变红灯
this.lighted = false;
// 相对应方向上的的绿灯变红灯
if (opposite != null) {
//Lamp.valueOf(opposite)返回此字符串对应的枚举
Lamp.valueOf(opposite).blackOut();
}
// 把下一个灯变绿灯
Lamp nextLamp = null;
if (next != null) {
nextLamp = Lamp.valueOf(next);
System.out.println("绿灯从" + name() + "-------->切换为" + next);
nextLamp.light();
}
// 把绿灯返回
return nextLamp;
}
}
package itheima.com.tracffic;
/**
* 灯控制器
*
* */
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class LampControler {
private Lamp currentLamp;
public LampControler() {
//由东向西开始
this.currentLamp = Lamp.E2W;
currentLamp.light();
// 定时器/*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
currentLamp = currentLamp.blackOut();
}
}, 15, 15, TimeUnit.SECONDS);
}
}
import itheima.com.tracffic.LampControler;
import itheima.com.tracffic.Road;
/**
* 启动线程
*
* */
public class TrafficTest {
/**
* @param args
*/
public static void main(String[] args) {
String[] road =new String []{"N2S","S2N","E2W","W2E ","E2S","W2N","S2W ","N2E","N2W","W2S","S2E","E2N"};
for(int i=0;i<road.length;i++){
new Road(road[i]);
}
new LampControler();
}
}