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日

相关文章

  • 深入解析Java的Spring框架中的混合事务与bean的区分

    深入解析Java的Spring框架中的混合事务与bean的区分,这是一个比较广泛的话题,我们可以从以下几个方面进行讲解: Spring框架事务管理的概述 Spring混合事务的定义与原理 Spring Bean的定义与作用 如何区分Spring混合事务与Bean 1. Spring框架事务管理的概述 Spring框架中的事务管理是一种重要的机制,可以帮助我们…

    Java 2023年5月20日
    00
  • java代码执行字符串中的逻辑运算方法

    首先我们需要理解字符串中的逻辑运算方法。在Java中,我们可以使用以下方法在字符串中执行逻辑运算: eval():将字符串解析为表达式并执行它。这是最常用的方法,但也是最危险的方法,因为它可以执行任意的Java代码。因此,在使用该方法时,需要特别小心,确保输入的字符串不会被恶意利用。 ScriptEngineManager和ScriptEngine:这些Ja…

    Java 2023年5月23日
    00
  • 详解spring cloud如何使用spring-test进行单元测试

    当我们使用Spring Cloud来构建微服务应用程序的时候,我们需要对代码进行单元测试,以确保代码质量和应用的正确性。Spring提供了一个非常强大的测试框架:Spring Test,可以帮助我们实现Spring Cloud应用程序的单元测试。本文将详细介绍如何使用Spring Test进行单元测试。 什么是Spring Test 在我们开始介绍如何使用S…

    Java 2023年5月31日
    00
  • Java Web实现文件下载和乱码处理方法

    针对Java Web实现文件下载和乱码处理的完整攻略,可以分为以下几个步骤: 第一步:设置response的headers response.setContentType("application/octet-stream"); // 告诉浏览器当前是二进制文件 response.setHeader("Content-Dispo…

    Java 2023年5月20日
    00
  • 基于Java回顾之I/O的使用详解

    基于Java回顾之I/O的使用详解 什么是I/O I/O是输入输出的缩写,Java中I/O指的是从输入源读取数据,或将数据输出到输出目标。Java提供了大量的I/O类和接口,以方便我们处理各种输入和输出。 I/O的分类 输入流 输入流用于从输入源读取数据,Java提供了多种输入流,常用的有: FileInputStream:从文件中读取数据。 ByteArr…

    Java 2023年5月26日
    00
  • Java/Web调用Hadoop进行MapReduce示例代码

    Java/Web调用Hadoop进行MapReduce的完整攻略涉及以下步骤: 准备Hadoop集群在进行Java/Web调用Hadoop进行MapReduce前,首先需要准备好Hadoop集群环境。Hadoop集群环境的准备可以参考Hadoop官方文档或其他网络资料。 编写MapReduce程序MapReduce是Hadoop中一种经典的计算框架,用于处理…

    Java 2023年6月15日
    00
  • javaweb Servlet开发总结(一)

    针对“javaweb Servlet开发总结(一)”这个主题,我将给出完整的攻略,以便更好地帮助您学习Servlet开发。 一、概述 本文将介绍Servlet的基本概念、运作方式和开发流程,为读者带来全面深入的理解和掌握Servlet开发技术。 二、Servlet入门 1.什么是Servlet Servlet是一种运行在Web服务器上的Java程序,用于响应…

    Java 2023年6月15日
    00
  • 深入解析Java的Struts框架中的控制器DispatchAction

    深入解析Java的Struts框架中的控制器DispatchAction DispatchAction的概述 Struts是一个MVC架构的Web框架,其中控制器层由Action实现。DispatchAction是Struts中一个特殊的Action,它根据请求参数的值映射到相应的方法进行处理,相当于一组Action的集合,可以大大简化代码实现。 Dispa…

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