java多线程模拟实现售票功能

Java多线程模拟实现售票功能,主要涉及Java的并发编程和线程同步操作。以下是实现该功能的步骤:

步骤一:创建Ticket类及构造方法

public class Ticket {
    private int num;

    public Ticket(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

注释:该类表示售票的对象,其中num表示剩余票数。

步骤二:创建Thread子类TicketSeller

public class TicketSeller extends Thread {
    private final Ticket ticket;
    private int nums;

    public TicketSeller(Ticket ticket, int nums, String name) {
        super(name);
        this.ticket = ticket;
        this.nums = nums;
    }

    @Override
    public void run() {
        while (ticket.getNum() > 0) {
            synchronized (ticket) {
                if (ticket.getNum() - nums >= 0) {
                    ticket.setNum(ticket.getNum() - nums);
                    System.out.println(Thread.currentThread().getName() + " sale " + nums + " tickets, there are " + ticket.getNum() + " left." );
                } else {
                    System.err.println(Thread.currentThread().getName() + " sale " + ticket.getNum() + " tickets, the ticket has sold out.");
                    break;
                }
            }
            try {
                // 模拟售票时间
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

注释:该类继承自Thread类,主要用于售票线程的实现。其中,ticket表示售票对象,nums表示每次售票的数量。在run()方法中,通过synchronized关键字来实现线程同步。

步骤三:创建TicketSellerTest类

public class TicketSellerTest {
    public static void main(String[] args) {
        Ticket ticket = new Ticket(100);//创建售票对象
        TicketSeller seller1 = new TicketSeller(ticket, 1, "售票窗口1");
        TicketSeller seller2 = new TicketSeller(ticket, 2, "售票窗口2");
        seller1.start();
        seller2.start();
    }
}

注释:该类为测试类,主要用于执行售票功能的调用。其中,创建售票对象ticket,同时创建两个售票窗口seller1和seller2。创建并启动售票线程。

步骤四:测试结果

运行TicketSellerTest类,运行结果如下:

售票窗口1 sale 1 tickets, there are 99 left.
售票窗口2 sale 2 tickets, there are 97 left.
售票窗口1 sale 1 tickets, there are 96 left.
售票窗口2 sale 2 tickets, there are 94 left.
售票窗口1 sale 1 tickets, there are 93 left.
售票窗口2 sale 2 tickets, there are 91 left.
售票窗口1 sale 1 tickets, there are 90 left.
售票窗口2 sale 2 tickets, there are 88 left.
...

注释:售票窗口1和售票窗口2异步售票,两个窗口共同售出了售票对象ticket中的100张票。

示例说明

  1. 如果将TicketSeller类的run()方法中synchronized改为锁住当前类对象,则每次只有一个线程能卖到票,其余线程都无法访问,从而失败。这说明线程同步的作用。
  2. 如果将Ticket类的构造方法中num改为0,则TicketSeller类的run()方法中不会进入循环,从而不会售票。这说明必须保证售票对象中票数大于0,否则售票无法进行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程模拟实现售票功能 - Python技术站

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

相关文章

  • 如何开发一个简单的Akka Java应用

    如何开发一个简单的Akka Java应用 Akka 是一个构建并发、分布式、可扩展的消息驱动应用程序的工具包与运行时。 要开发一个简单的Akka Java应用,可以按照以下步骤进行。 步骤一:添加依赖 在项目的 pom.xml 文件中添加以下依赖: <dependencies> <dependency> <groupId>…

    Java 2023年5月26日
    00
  • JavaWeb登录界面登录失败在同一页面进行提示的解决

    JavaWeb登录界面登录失败在同一页面进行提示的解决 当用户在JavaWeb应用程序中的登录界面输入错误的用户名或密码时,我们需要给与用户提示以完成用户友好体验。该过程有多种方法可以完成,其中一种方法是在同一页面上进行提示。本文将讲解如何在同一页面上显示登录失败的提示信息。 第一步:页面设计我们需要在登录页面添加一个div元素,将错误信息放在里面。但是在一…

    Java 2023年6月15日
    00
  • Mybatis-plus在项目中的简单应用

    以下是Mybatis-plus在项目中的简单应用攻略: 1. 简介 Mybatis-plus是Mybatis的增强工具,它大大简化了Mybatis的使用。Mybatis-plus提供了各种方便的功能,如:自动生成代码、分页查询、乐观锁、多租户等。 2. 安装 在Maven项目中使用Mybatis-plus,需在pom.xml中添加相关依赖: <depe…

    Java 2023年5月20日
    00
  • JSP教程(六)-怎么在JSP中跳转到别一页面

    下面是关于在JSP页面中跳转到另一页面的完整攻略。 1. 使用HTML的超链接 在JSP页面中跳转到另一个页面可以使用HTML的超链接。在a标签中使用href属性来指定目标页面的URL,例如: <a href="target.jsp">跳转到目标页面</a> 当用户单击链接时,就会跳转到目标页面。注意,这种方式的跳…

    Java 2023年6月15日
    00
  • 详解JAVA 线程-线程的状态有哪些?它是如何工作的?

    详解JAVA 线程-线程的状态有哪些?它是如何工作的? 线程的状态 Java中的线程状态通常分为以下几种: NEW(新建):新创建了一个线程对象,但还没有调用其start()方法 RUNNABLE(可运行):运行状态。线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程位于等待运行队列中,等待获取CPU的使用权 BLOCKED(阻塞):线程…

    Java 2023年5月19日
    00
  • SpringMVC 重定向参数RedirectAttributes实例

    下面我将详细讲解“SpringMVC 重定向参数RedirectAttributes实例”的完整攻略。 1. 概述 在SpringMVC中,通过重定向(Redirect)实现页面的跳转是常见的做法。但有时可能需要将一些参数传递到重定向后的页面中。例如,一个操作成功后,我们需要将提示消息传递给下一个页面。这时,就需要使用到RedirectAttributes这…

    Java 2023年6月15日
    00
  • 使用spring data的page和pageable如何实现分页查询

    使用Spring Data的Page和Pageable可以很方便地实现分页查询。下面是实现分页查询的完整攻略: 1. 添加依赖 首先需要在pom.xml中添加Spring Data JPA和对应的数据库驱动依赖: <dependency> <groupId>org.springframework.data</groupId&gt…

    Java 2023年5月20日
    00
  • 聊一聊Java反射

    聊一聊Java反射 反射是Java面向对象编程中的一种重要机制,通过反射可以在运行时获取类的信息,以及操作类的实例对象。在Java编程中,反射具有广泛的应用价值,例如通过反射动态创建对象,访问对象的私有成员变量和方法等。本文将为你详细讲解Java反射的完整攻略,包含了反射的基本使用方法、常见的场景应用以及对性能的影响等方面。 反射的基本使用方法 要使用反射,…

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