本系統使用 JDK 5 的枚舉與多線程特性,模擬十字路口交通燈的狀態切換與車輛通行邏輯。系統由四個核心類組成:Lamp(燈號枚舉)、LampController(燈號控制器)、Road(道路車流模擬)以及 MainClass(啟動入口)。
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() { ... }
}
使用 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);
}
}
每條道路獨立運行兩個線程:
方向_序號),存入 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);
}
}
創建 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,線程管理更健壯。