黑马程序员技术交流社区
标题:
7K面试题(交通灯管理系统) (根据张老师的视频按照自...
[打印本页]
作者:
李厚斌
时间:
2014-3-30 00:34
标题:
7K面试题(交通灯管理系统) (根据张老师的视频按照自...
本帖最后由 李厚斌 于 2014-3-30 00:36 编辑
主要修改了实际情况的8个交通灯
每个交通灯的对面交通灯,下一个交通灯。以及交通灯亮的时间。其实灯亮的true 和false 就是灯亮和灯灭了所以取消了灯灭方法。每个灯都会有对面灯的下一个灯。所以每个灯都添加了。并添加了灯亮时间属性
通过交通灯控制器控制。。灯亮时间
package day1;
public enum TrafficLamp{
N2S("N2E","S2N",45,false),S2N("S2W","N2S",45,false),E2W("E2S","W2E",45,false),W2E("W2N","E2W",45,false),
W2N("S2N","E2S",15,false),E2S("N2S","W2N",15,false),N2E("W2E","S2W",15,false),S2W("E2W","N2E",15,false);
private String nextLamp;//因为这是枚举。前面的对象是不能调用后面没创建的对象的。所以用的String。然后给句get方法。或得下一个交通灯
private int time;
private boolean lighted;
private String oppositeLamp;//同上
public String getOppositeLamp()//这步可以不要。因为在控制交通灯的程序里我要加入name方面看控制情况。没法调用私有属性。所以
{
return oppositeLamp;
}
//创建交通灯构造方法,给下一个灯。对面灯。亮多少时间。是否亮。初始化值
TrafficLamp(String nextLamp,String oppositeLamp,int time,boolean lighted){
this.time=time;
this.nextLamp=nextLamp;
this.lighted=lighted;
this.oppositeLamp=oppositeLamp;
}
public int getTime(){
return this.time;
}
public boolean getLighted(){
return lighted;
}
public TrafficLamp nextLamp(){
return TrafficLamp.valueOf(nextLamp);
}
public TrafficLamp oppositeLamp(){
return TrafficLamp.valueOf(oppositeLamp);
}
public void setLight(boolean lighted){
this.lighted=lighted;
this.oppositeLamp().lighted=lighted;
}
}
复制代码
package day1;
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.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class Road {
private List<String> vehicles=new ArrayList<String>();
private String roadName;//路的名字。。因为每条路是要和交通灯对应的。方便放行。new12条路的对象出来。
Road(String roadName){
this.roadName=roadName;
ExecutorService pool=Executors.newSingleThreadExecutor();//创建线程。给路上加上。随机在1-10秒加1辆车
pool.execute(new Runnable(){
public void run() {
for(int i=1;i<1000;i++){
try {
Thread.sleep((new Random().nextInt(10)+1)*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//操纵一个不能同步的集合。张老师为么没加锁呢。
synchronized(Road.class){
vehicles.add(Road.this.roadName+"_"+i);
}
}
}
});
}
//调用车的运行方式。有两种情况。有4个运行方向是不用被灯控制的会自行运行。还有8个运行时要受到灯控制的。
public void run(){
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);//创建线程。如果这个线路上的灯亮。每秒放行一次。
timer.scheduleAtFixedRate(new Runnable() {
public void run() {
if (vehicles.size()>0){
if(TrafficLamp.valueOf(Road.this.roadName).getLighted()){
synchronized(Road.class){
System.out.println(vehicles.remove(0)+"---is traveling");
}
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
//这是那四个不受交通灯控制的线路运行方式。少了一个对交通灯判断。原本是想加在上面的加一层判断。感觉每次都判断太啰嗦了就又加了个方法。
public void freeRun(){
ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
timer.scheduleAtFixedRate(new Runnable() {
public void run() {
if (vehicles.size()>0){
synchronized(Road.class){
System.out.println(vehicles.remove(0)+"---is traveling");
}
}
}
},
1,
1,
TimeUnit.SECONDS);
}
}
复制代码
</blockquote></div><div class="blockcode"><blockquote>package day1;
public class LampController implements Runnable {
public void run(){
TrafficLamp currentLamp=TrafficLamp.N2E;
currentLamp.setLight(true);//每次调用初始化一个交通灯点亮。对面的灯也就亮了
System.out.println(currentLamp.name()+currentLamp.getOppositeLamp()+":::::::::is lighted");
while(true){
try {
Thread.sleep(currentLamp.getTime()*1000);//等待灯亮的时间。
} catch (InterruptedException e) {
e.printStackTrace();
}
currentLamp.setLight(false);
currentLamp=currentLamp.nextLamp();
currentLamp.setLight(true);
System.out.println(currentLamp.name()+currentLamp.getOppositeLamp()+":::::::::is lighted");
}
}
}
复制代码
package day1;
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Thread(new LampController()).start();//创建灯亮线程独立于主线程 //每个方向的路线正常运行
new Road("N2S").run();
new Road("S2N").run();
new Road("E2W").run();
new Road("W2E").run();
new Road("W2N").run();
new Road("E2S").run();
new Road("S2W").run();
new Road("N2E").run();
new Road("N2W").freeRun();
new Road("W2S").freeRun();
new Road("S2E").freeRun();
new Road("E2N").freeRun();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2