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日

相关文章

  • java.lang.NumberFormatException异常解决方案详解

    Java.lang.NumberFormatException异常解决方案详解 什么是NumberFormatException异常? NumberFormatException异常是Java程序中常见的异常之一,表示将字符串转换为数字时出现错误。当字符串不符合数字格式或超出数字范围时,会抛出该异常。 解决方案 出现NumberFormatException…

    Java 2023年5月27日
    00
  • 扫微信小程序码实现网站登陆实现解析

    首先,我们需要了解微信小程序码和网站的登陆原理: 微信小程序码是一种二维码,可以直接扫描进入微信小程序。在网站中使用微信小程序码登录,需要先在微信公众平台上绑定网站的 appid,并在小程序代码中引入网站的登录页面。 网站的登陆原理,一般都是使用账号密码等安全信息进行验证,并在验证成功后向用户发放 token,以标识用户的身份。在这个过程中,需要涉及到加密与…

    Java 2023年5月23日
    00
  • 教你用Java SpringBoot如何解决跨域

    教你用 Java Spring Boot 如何解决跨域 在本文中,我们将详细讲解如何使用 Java Spring Boot 解决跨域问题。我们将使用 Spring Boot 2.5.0 版本的源码进行分析。 什么是跨域? 跨域是指在浏览器中,当一个 Web 应用程序试图访问另一个域名下的资源时,浏览器会阻止这种行为。这是由于浏览器的同源策略所导致的。同源策略…

    Java 2023年5月15日
    00
  • Spring Security内置过滤器的维护方法

    Spring Security 是一款基于 Servlet Filter 的安全框架,它提供了许多内置的过滤器来实现各种不同的安全策略。本文将详细讲解 Spring Security 内置过滤器的维护方法,以帮助开发者更好地使用 Spring Security。 什么是 Spring Security 内置过滤器? Spring Security 内置了许多…

    Java 2023年5月20日
    00
  • java 中 System.out.println()和System.out.write()的区别

    Java 中 System 类提供了输出字符流的功能,其中 System.out 对象可以输出到标准输出流。在这个对象中,有两个常见的方法是 System.out.println() 和 System.out.write(),本文将详细讲解它们之间的区别以及使用场景和示例。 System.out.println() 和 System.out.write() …

    Java 2023年5月26日
    00
  • SpringBoot导入导出数据实现方法详解

    SpringBoot导入导出数据实现方法详解 在开发Web应用程序时,数据的导入和导出是一项核心功能。SpringBoot提供了多种方式来实现数据的导入和导出,本文将详细介绍其中常用的两种方式。 基于EasyPOI实现Excel导入和导出 EasyPOI是一个简单易用的Java Excel操作库,它提供了丰富的API和自定义标签来快速创建Excel文件。下面…

    Java 2023年5月20日
    00
  • maven-compiler-plugin版本指定方式

    当我们在使用Maven构建Java项目时,通常需要编译Java源代码。而编译Java源代码需要用到maven-compiler-plugin插件。本篇攻略将详细讲解如何指定maven-compiler-plugin的版本。 步骤一:在pom.xml文件中添加maven-compiler-plugin的配置信息 在pom.xml文件中,我们可以通过<bu…

    Java 2023年5月19日
    00
  • Spring Security实现基于角色的访问控制框架

    为了实现基于角色的访问控制,Spring提供了一个框架:Spring Security。它可以帮助我们管理用户的认证和授权,并提供一些便利工具来实现对不同角色的访问控制。本文将介绍如何使用Spring Security来实现基于角色的访问控制,并提供两个示例来辅助理解。 一、Spring Security的概念和架构 1.1. Spring Security…

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