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 File类常用方法与文件过滤器详解

    Java File类是对文件系统中的文件和文件夹进行操作的类。它提供了很多常用的方法,可以方便地对文件进行读取、写入和其他的一些操作。本文将详细讲解Java File类的常用方法及文件过滤器的使用。 文件对象创建 File类的构造方法很多,常见的有以下几种: File(File parent, String child):从父抽象路径名和子路径名字符串创建新…

    Java 2023年5月19日
    00
  • 从ReentrantLock角度解析AQS

    是它,是它,就是它,并发包的基石; 一、概述 闲来不卷,随便聊一点。 一般情况下,大家系统中至少也是JDK8了,那想必对于JDK5加入的一系列功能并不陌生吧。那时候重点加入了java.util.concurrent并发包,我们简称为JUC。JUC下提供了很多并发编程实用的工具类,比如并发锁lock、原子操作atomic、线程池操作Executor等等。下面,…

    Java 2023年4月17日
    00
  • jsp response.sendRedirect()用法详解

    JSP response.sendRedirect()用法详解 在JSP开发中,经常需要进行页面的跳转。其中,最常用的跳转方法是 response.sendRedirect()。本文将对 response.sendRedirect() 方法进行详细讲解,包括使用场景、语法、注意事项以及示例说明等内容。 一、使用场景 response.sendRedirect…

    Java 2023年6月15日
    00
  • 全面解析java中的hashtable

    全面解析java中的Hashtable 介绍 Hashtable是Java中提供的一种哈希表数据结构的实现,它实现了Map接口,采用键/值对的方式存储数据,并根据键的哈希值存储和访问数据,具有快速查找的优势。 Hashtable是线程安全的,因为它的所有方法都是同步的,但这也导致在高并发情况下性能较低,在JDK1.5之后,Java提供了ConcurrentH…

    Java 2023年5月26日
    00
  • A标签触发onclick事件而不跳转的多种解决方法

    当我们在HTML中使用标签时通常会使用它来跳转到其他页面。但是,如果我们希望在用户点击这个链接时触发一些功能,而不是跳转到其他页面,我们可以使用onclick事件。本文将介绍几种A标签触发onclick事件而不跳转的多种解决方法。 方法一:Javascript:void(0) 使用Javascript:void(0)作为标签的href值,它可以防止页面跳转,…

    Java 2023年6月15日
    00
  • 仅5步搞定Android开发环境部署 Android开发环境搭建教程

    仅5步搞定Android开发环境部署 Android开发环境的搭建是Android开发的必备步骤。随着Android的快速发展,环境的安装和配置变得越来越简单。本教程将在5步之内教您如何快速搭建Android开发环境。 步骤1:安装Java JDK 首先,我们需要安装Java JDK,您可以从以下链接中下载安装程序:https://www.oracle.co…

    Java 2023年5月26日
    00
  • Java实现学生管理系统(IO版)

    Java实现学生管理系统(IO版)攻略 简介 本文将介绍如何使用Java语言实现学生管理系统,使用的是Java中的IO流处理方式,实现添加学生信息、查询学生信息、删除学生信息、修改学生信息等功能。 实现步骤 1.创建项目 首先,我们需要创建一个Java项目,可以使用Eclipse或者其他Java开发工具。 2.创建类和文件 在src目录下创建”com.stu…

    Java 2023年5月23日
    00
  • Java C++算法题解leetcode801使序列递增的最小交换次数

    让我来详细讲解一下“Java C++算法题解leetcode801使序列递增的最小交换次数”的完整攻略。 问题描述 题目名称:使序列递增的最小交换次数 题目描述:给定一个数组 nums,你需要将数组连续的子序列进行升序排列,使得最终得到的数组是递增的。请你计算并返回最少的交换次数,使得数组满足题意。 示例 1: 输入:nums = [1,3,5,4,2,6,…

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