首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

JDK 5 交通燈模擬控制系統實現

     編輯:Java 相關知識

系統概述

本系統使用 JDK 5 的枚舉與多線程特性,模擬十字路口交通燈的狀態切換與車輛通行邏輯。系統由四個核心類組成:Lamp(燈號枚舉)、LampController(燈號控制器)、Road(道路車流模擬)以及 MainClass(啟動入口)。

核心組件解析

1. Lamp 枚舉——燈號狀態與切換邏輯

Lamp 定義了 12 個方向的燈號(如南向北直行 S2N、東向西左轉 E2W 等),每個枚舉實例攜帶三個屬性:

  • opposite:對向燈號名稱(同步綠燈)
  • next:下一組綠燈的燈號名稱
  • lighted:當前是否為綠燈

關鍵方法:

  • light():點亮當前燈與對向燈,輸出日誌。
  • blackout():熄滅當前燈與對向燈,並啟動 next 指定的下一組燈,返回下一組燈的枚舉實例。
public enum Lamp {
    S2N("N2S","S2W",false), S2W("N2E","E2W",false), S2E(null,null,true),
    E2W("W2E","E2S",false), E2S("W2N","S2N",false), E2N(null,null,true),
    N2S(null,null,false), N2E(null,null,false), N2W(null,null,true),
    W2E(null,null,false), W2N(null,null,false), W2S(null,null,true);

    String opposite, next; boolean lighted;
    private Lamp(String opposite, String next, boolean lighted) { ... }
    public boolean isLighted() { return lighted; }
    public void light() { ... }
    public Lamp blackout() { ... }
}

2. LampController——定時切換燈號

使用 ScheduledExecutorService 每 10 秒執行一次 blackout(),實現燈號循環切換。初始燈號為 S2N。

public class LampController {
    private Lamp currentLamp = Lamp.S2N;
    public LampController() {
        currentLamp.light();
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(
            () -> currentLamp = currentLamp.blackout(), 10, 10, TimeUnit.SECONDS);
    }
}

3. Road——車流產生與通行檢查

每條道路獨立運行兩個線程:

  • 車輛產生線程:每 1~10 秒隨機產生一輛車(車輛 ID 格式:方向_序號),存入 List。
  • 通行檢查線程:每秒檢查對應燈號是否為綠燈,若是則放行首輛車(移除並打印)。
public class Road {
    private String name; private List vehicles = new ArrayList<>();
    public Road(String name) {
        this.name = name;
        // 車輛產生
        Executors.newSingleThreadExecutor().execute(() -> {
            for (int i = 0; i < 1000; i++) {
                Thread.sleep((new Random().nextInt(10) + 1) * 1000);
                vehicles.add(name + "_" + i);
            }
        });
        // 通行檢查
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
            if (!vehicles.isEmpty() && Lamp.valueOf(name).isLighted()) {
                System.out.println(vehicles.remove(0) + " is traversing");
            }
        }, 1, 1, TimeUnit.SECONDS);
    }
}

4. MainClass——系統啟動

創建 12 條道路實例並啟動燈號控制器。

public static void main(String[] args) {
    String[] directions = {"S2N","S2W","E2W","E2S","N2S","N2E","W2E","W2N","S2E","E2N","N2W","W2S"};
    for (String dir : directions) new Road(dir);
    new LampController();
}

設計亮點

  • 利用枚舉封裝燈號狀態與切換規則,代碼清晰且類型安全。
  • 採用 ScheduledExecutorService 替代傳統 Timer,線程管理更健壯。
  • 道路與燈號解耦,道路僅通過名稱查詢燈號狀態,擴展性良好。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved