java 多线程交通信号灯模拟过程详解

Java多线程交通信号灯模拟是一个经典的多线程案例,它可以很好的展示多线程的同时执行与互斥访问的特性,是多线程初学者不可错过的一个练手项目。下面我将详细讲解其完整攻略。

一、技术原理

  1. 线程同步:多个线程之间的相互协作都要通过线程同步来达到,Java中提供了多种同步机制,而这里最常用的是 synchronized 关键字来实现同步。
  2. 阻塞与唤醒:在多线程中,需要控制线程的启动与停止,通常是使用wait()和notify()两个方法来实现。

二、模拟方案

  1. 定义枚举类型:会有三种交通灯状态,即红灯、绿灯、黄灯,为了避免错误输入,使用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;
    }
}
  1. 实现交通灯控制器:该类负责控制交通灯的转换,思路是通过 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();
            }
        }
    }
}
  1. 定义两辆车的类: 该类中的 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();
            }
        }
    }
}
  1. 示例场景与执行:我们定义了两辆车,让它们的速度和行驶方向不同,执行 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技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java10新特性解读

    Java10新特性解读 Java10是Java语言的最新版本,自2018年3月正式发布以来,引入了不少新特性和改进。本文将详细解析Java10的新特性,并给出一些相应的示例。 局部变量类型推断 在Java10中,引入了一项新特性:局部变量类型推断。这意味着,当我们声明局部变量时,可以使用var关键字代替显式类型声明。编译器将根据变量的初始值来自动推断其类型。…

    Java 2023年5月19日
    00
  • 详解Spring Boot 定时任务的实现方法

    Spring Boot提供了一种简单的方式来实现定时任务。以下是详解Spring Boot定时任务的实现方法的完整攻略: 添加依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp…

    Java 2023年5月15日
    00
  • java正则表达式验证函数

    下面我将详细讲解“Java正则表达式验证函数”的完整攻略。 什么是正则表达式? 正则表达式是一种文本模式,可用于匹配或搜索文本中的特定模式。它是由一系列字符和元字符组成的表达式,这些字符和元字符可以用来匹配文本中的模式。 Java中的正则表达式 在Java中,正则表达式可以使用java.util.regex包中的类。其中最常用的类是Pattern和Match…

    Java 2023年5月26日
    00
  • SpringBoot中支持Https协议的实现

    SpringBoot是一个非常流行的Java开发框架,支持各种协议,如Http、Https等。本篇攻略将详细讲解SpringBoot中支持Https协议的实现方法。 准备工作 在SpringBoot中支持Https协议,需要准备三个文件: SSL证书文件(如:keystore.jks或server.crt) SSL证书密码(如:123456) 修改appli…

    Java 2023年5月20日
    00
  • 教你怎么用SpringBoot+Mybati-Plus快速搭建代码

    感谢您对使用SpringBoot+MyBatis-Plus进行快速代码搭建的关注,以下是使用这个技术栈进行代码搭建的攻略: 1. 准备工作 在开始使用SpringBoot和MyBatis-Plus进行开发之前,需要先完成以下准备工作: 安装JDK,安装Maven或者Gradle(本文以Maven为例) 创建数据库表和准备好数据 2. 创建SpringBoot…

    Java 2023年6月1日
    00
  • Java下SpringBoot创建定时任务详解

    下面我将为您详细讲解“Java下SpringBoot创建定时任务详解”的完整攻略。 SpringBoot定时任务详解 什么是定时任务 定时任务指定在特定的时间段执行的一种操作,比如每天凌晨1点执行一次数据库备份操作、每分钟执行一次数据同步操作等。在开发中,经常使用定时任务来完成一些需要定期执行的任务。 SpringBoot中创建定时任务 SpringBoot…

    Java 2023年5月19日
    00
  • Java实现监听文件变化的三种方案详解

    Java实现监听文件变化的三种方案详解 在Java编程中,经常需要对文件进行监听,以便在文件发生更新时及时做出相应的处理。下面将介绍三种实现文件监听的方案,分别是Java 7的WatchService、commons-io库、以及第三方库jnotify。 1. Java 7的WatchService Java 7引入了WatchService API,它可以…

    Java 2023年5月20日
    00
  • JSP + Servlet实现生成登录验证码示例

    下面为你讲解如何使用JSP和Servlet实现生成登录验证码。 前置知识 在进行本文的代码实现前,你需要先了解以下技术: Java 编程语言 Servlet 技术 JSP 技术 HTTP 协议 准备工作 在开始代码实现前,请确保你的开发环境中已经正确配置了JSP和Servlet开发环境。这里以Eclipse + Tomcat服务器为例,其他开发环境的配置方法…

    Java 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部