java多线程卖电影票的三种实现方式

news2024/9/25 13:18:22

java多线程卖电影票的三种实现方式

  • 一、需求描述
  • 二、实现方式
      • 1、继承Thread类的方式
      • 2、实现Runnable接口的方式
      • 3、使用Lock锁的方式

一、需求描述

某电影院目前正在上映国产大片,共有1000张票,而它有2个窗口卖票,请设计一个程序模拟该电影院卖票

二、实现方式

1、继承Thread类的方式

自定义开发一个MyThread类,来继承Thread类,重写run方法,定义一个ticket共享变量,表示当前卖的是第几张票,一定要使用static关键字来修饰,这样可以确保每一个线程对象都共享这一个变量。具体代码如下:
MyThread类

package com.hidata.hiops.paas.demo;

/**
 * @Description :
 * @Date: 2023-10-08 10:38
 */
public class MyThread extends Thread {

    public static int ticket = 0;

    @Override
    public void run() {
        while (true){
            synchronized (MyThread.class){
                if (ticket < 1000){
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ticket ++;
                    System.out.println(getName() + "正在卖第" + ticket + "张票, 剩余 " + (1000 - ticket) + "张");
                }else{
                    break;
                }
            }
        }
    }
}

测试类

package com.hidata.hiops.paas.demo;

/**
 * @Description :
 * @Date: 2023-10-08 10:46
 */
public class TestDemo {
    public static void main(String[] args) {

        /**
         *方式一:继承Thread类
         */
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.setName("窗口1");
        t2.setName("窗口2");

        t1.start();
        t2.start();
    }
}

运行结果
在这里插入图片描述

......................
窗口1正在卖第978张票, 剩余 22张
窗口1正在卖第979张票, 剩余 21张
窗口1正在卖第980张票, 剩余 20张
窗口1正在卖第981张票, 剩余 19张
窗口1正在卖第982张票, 剩余 18张
窗口1正在卖第983张票, 剩余 17张
窗口2正在卖第984张票, 剩余 16张
窗口2正在卖第985张票, 剩余 15张
窗口2正在卖第986张票, 剩余 14张
窗口2正在卖第987张票, 剩余 13张
窗口2正在卖第988张票, 剩余 12张
窗口2正在卖第989张票, 剩余 11张
窗口2正在卖第990张票, 剩余 10张
窗口2正在卖第991张票, 剩余 9张
窗口2正在卖第992张票, 剩余 8张
窗口2正在卖第993张票, 剩余 7张
窗口2正在卖第994张票, 剩余 6张
窗口2正在卖第995张票, 剩余 5张
窗口2正在卖第996张票, 剩余 4张
窗口2正在卖第997张票, 剩余 3张
窗口2正在卖第998张票, 剩余 2张
窗口2正在卖第999张票, 剩余 1张
窗口2正在卖第1000张票, 剩余 0

2、实现Runnable接口的方式

自定义开发一个MyRun类,来实现Runnable接口,重写run方法,定义一个ticket变量,表示当前卖的是第几张票,此时ticket变量,可以不用static关键字来修饰,因为只会创建一个MyRun实例,所以不存在变量不一致的问题,具体代码如下:
MyRun类

package com.hidata.hiops.paas.demo;

/**
 * @Description :
 * @Date: 2023-10-08 10:50
 */
public class MyRun implements Runnable {

    int ticket = 0;
    
    @Override
    public void run() {
        while (true){
            synchronized (MyRun.class){
                if (ticket < 1000){
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    ticket ++;
                    System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票, 剩余 " + (1000 - ticket) + "张");
                }else{
                    break;
                }
            }
        }
    }
}

测试类

package com.hidata.hiops.paas.demo;

/**
 * @Description :
 * @Date: 2023-10-08 10:46
 */
public class TestDemo {
    public static void main(String[] args) {

       /**
         * 方式二:实现Runnable接口
         */
        MyRun myRun = new MyRun();
        Thread tt1 = new Thread(myRun);
        Thread tt2 = new Thread(myRun);
        tt1.setName("窗口1");
        tt2.setName("窗口2");

        tt1.start();
        tt2.start();
    }
}

运行结果
在这里插入图片描述

3、使用Lock锁的方式

自定义开发一个MyLock类,来实现Runnable接口,重写run方法,定义一个ticket变量,表示当前卖的是第几张票,此时ticket变量,可以不用static关键字来修饰,再创建一个Lock锁对象,也不需要使用static修饰,所有的线程对象共用一把锁。因为只会创建一个MyRun实例,所以不存在变量不一致的问题,具体代码如下:
MyLock类

package com.hidata.hiops.paas.demo;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Description :
 * @Date: 2023-10-08 10:50
 */
public class MyLock implements Runnable {
    int ticket = 0;

    Lock lock = new ReentrantLock();

    @Override
    public void run() {
        while (true){
            lock.lock();
            try {
                if (ticket == 1000){
                    break;
                }else{
                    Thread.sleep(30);
                    ticket ++;
                    System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票, 剩余 " + (1000 - ticket) + "张");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }
}

测试类

package com.hidata.hiops.paas.demo;

/**
 * @Description :
 * @Date: 2023-10-08 10:46
 */
public class TestDemo {
    public static void main(String[] args) {

        /**
         * 方式三:使用Lock锁
         */

        MyLock myLock = new MyLock();
        Thread r1 = new Thread(myLock);
        Thread r2 = new Thread(myLock);
        r1.setName("窗口1");
        r2.setName("窗口2");

        r1.start();
        r2.start();
    }
}

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12.3 实现模拟鼠标录制回放

本节将向读者介绍如何使用键盘鼠标操控模拟技术&#xff0c;键盘鼠标操控模拟技术是一种非常实用的技术&#xff0c;可以自动化执行一些重复性的任务&#xff0c;提高工作效率&#xff0c;在Windows系统下&#xff0c;通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的…

Ubuntu22.04.3安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 Ubuntu22.04.3安装教程 虚拟机系列文章前言Ubuntu22.04.3安装&#xff08;图文&#xff09; 前…

【C++心愿便利店】No.7---C++之运算符重载

文章目录 前言一、运算符重载的引用二、运算符重载三、赋值运算符重载四、日期类的实现五、const成员六、取地址及const取地址操作符重载 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&#x1f31d; &#x1f…

onlyoffice历史版本功能实现

一&#xff1a;开启客户端配置 如果不开启&#xff0c;回调请求里面的history和changeUrl是空 二&#xff1a;客户端主要实现2个回调函数 1.实现onRequestHistory事件&#xff0c;该事件会在ui点击查看历史的时候发起,用于展示历史列表 关键在于获取到history的内容&#xff…

Vscode进行远程开发

之前用的是pycharm&#xff0c;但是同事说pycharm太重了&#xff0c;连接远程服务器的时候给远程服务器的压力比较大&#xff0c;有时候远程服务器可能都扛不住&#xff0c;所以换成了vscode。 参考博客 手把手教你配置VS Code远程开发工具&#xff0c;工作效率提升N倍 - 知…

【自动驾驶】PETR/PETRv2/StreamPETR论文分析

1.PETR PETR网络结构如下&#xff0c;主要包括image-backbone, 3D Coordinates Generator, 3D Position Encoder, transformer Decoder 1.1 Images Backbone 采用resnet 或者 vovNet,下面的x表示concatenate 1.2 3D Coordinates Generator 坐标生成跟lss类似&#xff0c;假…

从零开始的SRC挖掘

前言 每一次成功的渗透&#xff0c;都有一个非常完备的信息搜集。 大师傅讲的好呀&#xff1a;信息搜集的广度决定了攻击的广度&#xff0c;知识面的广度决定了攻击的深度。 点击此处即可领取282G网络安全学习资料 信息搜集 信息搜集可以从多个领域来看&#xff1a; 公司…

springboot vue 部署至Rocky(Centos)并自启,本文部署是若依应用

概述 1、安装nohup&#xff08;后台进程运行java&#xff09; 2、安装中文字体&#xff08;防止中文乱码&#xff09; 3、安装chrony&#xff08;保证分布式部署时间的一致性&#xff09; 5、安装mysql数据&#xff0c;迁移目录&#xff0c;并授权自启动&#xff1b; 6、安…

基于JavaSpring的学生宿舍管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88407844

Bootstrap网格系统的原理

Bootstrap 提供了一套响应式、移动设备优先的流式网格系统&#xff0c;随着屏幕或视口&#xff08;viewport&#xff09;尺寸的增加&#xff0c;系统会自动分为最多12列。 Bootstrap 网格系统&#xff08;Grid System&#xff09;的工作原理 网格系统通过一系列包含内容的行和…

HRM人力资源管理系统源码

HRM人力资源管理系统源码 运行环境&#xff1a;PHP8.1或以上 MYSQL5.7或以上 php扩展要求 fileinfo imagemagick 功能介绍&#xff1a; 综合仪表板 它通过其综合仪表板提供了员工总数、工单和帐户余额的概览。 您可以轻松访问组织中的缺席者以及详细的公告和预定会议列…

阿里云域名免费配置HTTPS

阿里云域名配置HTTPS - 知乎

零基础也能学会!Linux下安装RStudio工具及实现远程访问的详细指南

前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问&#xff0c;从而将 RStudio IDE 的强大功能和工作效率带到基于服务器的集中式环境中。 下面介绍在Linux docker中安装RStudio Server并结合cpolar内网…

JuiceFS 目录配额功能设计详解

JuiceFS 在最近 v1.1 版本中加入了社区中呼声已久的目录配额功能。已发布的命令支持为目录设置配额、获取目录配额信息、列出所有目录配额等。完整的详细信息&#xff0c;请查阅文档。 在设计此功能时&#xff0c;对于它的统计准确性&#xff0c;实效性以及对性能的影响&#…

工业交换机的“自适应”是什么意思?

工业交换机诸多性能指标中&#xff0c;我们常常看见有“自适应”这个指标。它到底是什么意思呢&#xff1f; 自适应也叫自动匹配、自协商&#xff0c;以太网技术发展到100M速率以后&#xff0c;出现了一个如何与原10M以太网设备兼容的问题&#xff0c;自协商技术就是为了解决这…

python中一些代码提速技巧

目录 用set而非list进行查找用dict而非两个list进行匹配查找优先使用for循环而不是while循环循环代替递归用缓存机制加速递归函数用numba加速Python函数使用collections.Counter加速计数使用collections.ChainMap加速字典合并使用map代替推导式进行加速使用filter代替推导式进行…

nacos2.0.2漏洞分析及解决方法

绕过鉴权情况 1. userAgentAuthWhite 设置为true&#xff0c;官方没有还没有解析为啥可以通过设置userAgent可以绕过鉴权 实验一 只要把请求header&#xff1a;User-Agent设置为&#xff1a;Nacos-Server&#xff0c;即可绕过鉴权 实验二 只要把请求header&#xff1a;User…

SpringBoot原理解析篇(一):parent 版本管理

SpringBoot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来 简化 Spring 应用的初始搭建以及开发过程。 Spring 程序缺点&#xff1a;依赖设置繁琐、配置繁琐 SpringBoot 程序优点&#xff1a;起步依赖&#xff08;简化依赖配置&#xff09;、自动配置&#x…

查看当前目录下文件所占用内存 du -sh

1. du -sh 查看当前目录下文件所占用内存 2.查看当前文件夹下&#xff0c;每个文件所占用内存 du -ah --max-depth1/

点云配准流程

迭代最近点算法&#xff08;Iterative CLosest Point简称ICP算法&#xff09; ICP算法对待拼接的2片点云&#xff0c;首先根据一定的准则确立对应点集P与Q&#xff0c;其中对应点对的个数&#xff0c;然后通过最小二乘法迭代计算最优的坐标变换&#xff0c;即旋转矩阵R和平移矢…