交通灯控制系统

交通信号灯

分析:信号灯Lamp类 :

四个方向 12条路线被12个信号灯控制(忽略黄灯)红灯停绿灯行

"S2N","N2S","S2W","N2E","E2W","W2E","E2S","W2N",

每两个一组,一组灯同时变绿或变红,程序代码只需要控制每组灯中的一个灯即可

"S2E","N2W","E2N","W2S"

后两行的灯是虚拟的,由于从南向东和从西向北以及它们的对应方向不受红绿灯的控制

枚举 变量lighted opposite 方法 light  ;breakOut

-------------------------------------------------------------------------------------------------------------------

信号灯控制LampController类

初始由南到北的交通灯为绿 10s后转换为红 下一个方向opposite变绿

变量currentLamp     调用Executors类

-------------------------------------------------------------------------------------------------------------------

 道路类Road

每一个Road实例(对象)代表一个路线  共需12个road对象

每条路线上随机产生车辆  车辆放入集合中保存

每条路线每秒检查一次该路线是否为绿灯,是则移除集合中第一辆汽车

变量 LIstanbul<>vechicles ;name

//模拟车辆不断随机上路的过程

//每隔一秒检查对应的灯是否为绿,是则放行一辆车

-------------------------------------------------------------------------------------------------------------------

主类Main

 12条路线放入一个集合 for(){批量创建}

调用信号灯控制类 

new LampController();

-------------------------------------------------------------------------------------------------------------------












package testtraffic;


/**
*
* @author guoshuai
*/
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 Lamp(String opposite, String next,boolean lighted) {
this.lighted = lighted;
this.opposite = opposite;
this.next = next;
}

private boolean lighted;
private String opposite;
private String next;
public boolean isLighted(){
return lighted;

}
/**
* 某个灯变绿时,它对应方向的灯也要变绿
*/
public void light(){
this.lighted=true;
if(opposite!=null){
Lamp.valueOf(opposite).light();
System.out.println(name() + " lamp is green,下面总共应该有6个方向能看到汽车穿过!");
}

}
/**
* 某个灯变红时,对应方向的灯也要变红,并且下一个方向的灯要变绿
* @return 下一个要变绿的灯
*/
public Lamp blackOut(){
this.lighted=false;
if(opposite!=null){
Lamp.valueOf(opposite).blackOut();
}
Lamp nextLamp=null;
if(next!=null){
nextLamp=Lamp.valueOf(next);
System.out.println("绿灯从"+name() +"--------------->"+next);
nextLamp.light();
}
return nextLamp;
}

}

//***************************************************************************************************************

package testtraffic;


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




/**
 *LampConraller 信号控制灯
 * currentLamp当前灯
 * @author guoshuai
 */
public class LampController {
    //构造器设初值 S2N为绿 亮
    private Lamp currentLamp;
    public LampController(){
    currentLamp=Lamp.S2N;
    currentLamp.light();
    
    /*每隔10秒将当前绿灯变为红灯,并让下一个方向的灯变绿*/
    
         ScheduledExecutorService Timer=Executors.newScheduledThreadPool(1);
         Timer.scheduleAtFixedRate(new Runnable() {


        @Override
        public void run() {
            currentLamp=currentLamp.blackOut();
                 }
                 },
                 2,
                 2, 
                 TimeUnit.SECONDS);
    }
}
//***************************************************************************************************************************

package testtraffic;


/**
 *创建12个交通路线
 * 开启交通灯管理
 * @author guoshuai
 */
public class MainClass {


    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String []a=new String[]{"S2N","S2W","E2W",
            "E2S","N2S","N2E","W2E",
            "W2N","S2E","E2N","N2W","W2S"};
        //批量创建12条路线
        for (int i = 0; i < a.length; i++) {
            new Road(a[i]);
            
        }
        //启用信号灯系统
        new LampController();
    }
    
}
//*******************************************************************************************************************************************************88
    
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;


/**
 *把路看成一个集合 放置产生的汽车 一秒通过一辆  当该路段交通灯为绿灯时 汽车-1
 * 总共12条路线 每条路线随机产生车辆 每条路每1秒判断一次(是否为绿线)
 * @author guoshuai
 */
public class Road {
     private List<Object> vechicles  =new ArrayList<Object>();
     private String name;
     public Road(String name){
         this.name=name;
         //在构造器生产汽车
         ScheduledExecutorService ThreadPool=Executors.newScheduledThreadPool(1);
         ThreadPool.execute(new Runnable() {


             @Override
             public void run() {
                 for (int i = 0; i < 1000; i++) {
                     try {
                         Thread.sleep((new Random().nextInt(10)+1)*1000);
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
 
                     vechicles.add(Road.this.name+"_"+i);
                 }
             }
         });
         //每隔一秒检查是否为绿灯 是则放行一辆车
         ScheduledExecutorService timer=Executors.newScheduledThreadPool(1);
         timer.scheduleAtFixedRate(new Runnable() {


             @Override
             public void run() {
                if(vechicles.size()>0){
                   boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
                   if(lighted){
                       System.out.println(vechicles.remove(0)+" is traversing !");}
                }
             }
         }, 
                 1, 
                 1, 
                 TimeUnit.SECONDS);
     }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值