Java多线程交通信号灯模拟是一个经典的多线程案例,它可以很好的展示多线程的同时执行与互斥访问的特性,是多线程初学者不可错过的一个练手项目。下面我将详细讲解其完整攻略。
一、技术原理
- 线程同步:多个线程之间的相互协作都要通过线程同步来达到,Java中提供了多种同步机制,而这里最常用的是 synchronized 关键字来实现同步。
- 阻塞与唤醒:在多线程中,需要控制线程的启动与停止,通常是使用wait()和notify()两个方法来实现。
二、模拟方案
- 定义枚举类型:会有三种交通灯状态,即红灯、绿灯、黄灯,为了避免错误输入,使用Java的枚举类型来限定状态值。
public enum TrafficLightStateEnum {
RED(1), GREEN(2), YELLOW(3);
private int stateIndex;
private TrafficLightStateEnum(int stateIndex){
this.stateIndex = stateIndex;
}
public int getStateIndex(){
return stateIndex;
}
}
- 实现交通灯控制器:该类负责控制交通灯的转换,思路是通过 wait() 和 notify() 方法来控制交通灯的状态转换,同时要保证多线程操作时不会出现访问同一资源的情况,需要使用 synchronized 方法来控制同步。
public class TrafficLightController {
private TrafficLightStateEnum currentTrafficLightState;
public TrafficLightController() {
this.currentTrafficLightState = TrafficLightStateEnum.RED;
}
public synchronized void run() {
while (true) {
try {
switch (currentTrafficLightState) {
case RED:
System.out.println("Red light: stop!");
wait(1000 * 5);
currentTrafficLightState = TrafficLightStateEnum.GREEN;
break;
case GREEN:
System.out.println("Green light: go!");
wait(1000 * 5);
currentTrafficLightState = TrafficLightStateEnum.YELLOW;
break;
case YELLOW:
System.out.println("Yellow light: caution!");
wait(1000 * 2);
currentTrafficLightState = TrafficLightStateEnum.RED;
break;
}
notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 定义两辆车的类: 该类中的 run() 方法用于让车在交通灯的不同状态下随机行驶,通过控制 Runnable 实例的 start() 方法来启动该线程。
public class Car implements Runnable {
private int speed;
private int direction;
private TrafficLightController trafficLightController;
public Car(int speed, int direction, TrafficLightController trafficLightController) {
this.speed = speed;
this.direction = direction;
this.trafficLightController = trafficLightController;
}
@Override
public void run() {
while (true) {
try {
switch (trafficLightController.getCurrentTrafficLightState()) {
case RED:
System.out.println("Car stop!");
Thread.sleep(1000 * 5 / speed);
break;
case GREEN:
System.out.println("Car go!");
Thread.sleep(1000 * 1 / speed);
break;
case YELLOW:
System.out.println("Car caution!");
Thread.sleep(1000 * 3 / speed);
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 示例场景与执行:我们定义了两辆车,让它们的速度和行驶方向不同,执行 run() 方法即可。
public class Main {
public static void main(String[] args) {
TrafficLightController trafficLightController = new TrafficLightController();
Car car1 = new Car(1, 1, trafficLightController);
Car car2 = new Car(2, 2, trafficLightController);
new Thread(trafficLightController::run).start();
new Thread(car1::run).start();
new Thread(car2::run).start();
}
}
三、示例说明
示例一:
假设有一辆行驶方向为1,速度为2的车,它需要随着交通灯的状态而行驶,即在红灯停止,在绿灯通行,在黄灯时慢行。执行结果如下:
Red light: stop!
Car stop!
Car stop!
Green light: go!
Car go!
Yellow light: caution!
Car caution!
Red light: stop!
Car stop!
示例二:
假设有两辆车,它们的行驶方向分别为1和2,速度也有所不同,对执行结果进行观察:
Red light: stop!
Car stop!
Car stop!
Green light: go!
Car go!
Yellow light: caution!
Car caution!
Red light: stop!
Car stop!
Car stop!
Green light: go!
Car go!
Yellow light: caution!
Car caution!
以上就是Java多线程交通信号灯模拟的详细攻略,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java 多线程交通信号灯模拟过程详解 - Python技术站