交通灯管理系统总结

本文介绍了一个基于多线程的交通灯系统模拟程序。该程序利用Java的ScheduledExecutorService实现定时任务,通过Lamp、Road及LampController类模拟了十字路口的交通灯控制逻辑,并演示了如何模拟车辆在不同方向上的行驶。



1.道路有4个方向 路径就有12个组合方式 
先直行再左行, 右行的灯常绿

2.类: Lamp ,LampControl,Car, Road
而car只需要一个字符串来表示即可。

3.Road
一共12条路径
使用List来表示某个路径上的车辆存储
每隔1~10秒 add一辆车 并打上index作为记号
每秒进行一次检查 是否灯为绿 是 remove一辆 否则 什么都不做

需要导入的两个方法:
public static ScheduledExecutorService newScheduledThreadPool(intcorePoolSize)
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

ScheduledFuturescheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnitunit)
创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在initialDelay 后开始执行,然后在initialDelay+period 后执行,接着在 initialDelay+ 2 * period 后执行,依此类推。

变量 : name 代表路线名称

方法只提供了构造方法方法,
Road被初始化时,就会建立一个随即时间增加车辆的线程并每隔1秒检查一下灯的状态 来确定是否放行


4.Lamp
使用枚举的方法来定义灯
一共有12个灯
右转灯都是常量
而对行的灯总是一起变化的 因此只需要考虑其中4个灯的交替变换

每个灯3个参数,分别表示:
和他配对的灯(非逻辑灯为null),下一个逻辑灯(非逻辑灯为null),红灯还是绿灯

考虑两个方法
逻辑灯绿灯 配对的灯也变绿
逻辑灯红灯 配对的灯也红灯 下一个逻辑灯绿灯


5.LampController
有一个初始化值
南北方向的灯为绿
然后每隔10秒开始当前逻辑灯变红 下一个逻辑等变绿

变量为currentLamp,表示当前逻辑灯

方法只有构造方法:每隔10秒换灯

MainClass
产生12个方向路线 并建立交通灯系统

package net.csdn;

public class MainClass {

 
 public static void main(String[] args) {
  
  //产生12个方向的路线  
  String [] directions
   = newString[]{"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
  for(int i=0;i<directions.length;i++)
  {
   new Road(directions[i]);
  }
  
  //产生整个交通灯系统  
  new LampController();
 }

}

 

package net.csdn;

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;
 public Road(String name){
  this.name = name;
  
  //模拟车辆不断随机上路的过程 
  //public static ExecutorService newSingleThreadExecutor()
  //创建一个使用单个 worker 线程的 Executor
  ExecutorService pool = Executors.newSingleThreadExecutor();
  //void execute(Runnable command)
        //在未来某个时间执行给定的命令
  pool.execute(new Runnable(){
   public void run(){
    //每隔1~10秒增加这条线路上的一辆车 并给与编号
    int i=0;
    while(true){
     try {
      Thread.sleep((new Random().nextInt(10) + 1)* 1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }
     vechicles.add(Road.this.name + "_" +++i);
    }    
   }
   
  });
  
  //每隔一秒检查对应的灯是否为绿,是则放行一辆车  
  
  //public staticScheduledExecutorService newScheduledThreadPool(int corePoolSize)
  //创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
  ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
  
  // ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay, long period, TimeUnit unit)
        //创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,
  //然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。
  timer.scheduleAtFixedRate(
    new Runnable(){
     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);
  
 }
}


package net.csdn;


public enum Lamp {
 //四个逻辑等
 S2N("N2S","S2W",false),S2W("N2E","E2W",false),E2W("W2E","E2S",false),E2S("W2N","S2N",false),
 //opposite灯
 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 boolean lighted;
 //对应的方向 
 private String opposite;
 //下一个逻辑灯 
 private String next;
 
 //构造函数
 private Lamp(String opposite,String next,boolean lighted)
 {
  this.opposite = opposite;
  this.next = next;
  this.lighted = lighted;
 }
 
 //红 ->false 绿-> true
 public boolean isLighted()
 {
  return lighted;
 }
 
  // 某个灯变绿时,它对应方向的灯也要变绿
   
 public void light()
 {
  this.lighted = true;
  //判断 方便调用light();
  if(opposite != null)
  {
   //使用valueOf可以很容易的调用到opposite和next的对象
   Lamp.valueOf(opposite).light();
  }
  System.out.println(this.name() + " lamp is green,6个方向能看到汽车穿过..");
  
 }
 
 // 逻辑等灯变红,对应的灯也要变红,下一个逻辑灯要变绿
 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 net.csdn;

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

public class LampController {
 private Lamp currentLamp;
 
 public LampController(){
  //刚开始让由南向北的灯变绿
  currentLamp = Lamp.S2N;
  currentLamp.light();
  
  //1秒延迟启动
  ScheduledExecutorService timer=  Executors.newScheduledThreadPool(1);
  //每隔10秒开始当前逻辑灯变红下一个逻辑等变绿
  timer.scheduleAtFixedRate(
    new Runnable(){
     public  void run(){
      currentLamp = currentLamp.blackOut();
    }
    },
    10,
    10,
    TimeUnit.SECONDS);
 }
}

 


1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话讨论(如‘你心中最经典的钢琴曲’)、线上歌单创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值