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

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;@Overridepublic 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;@Overridepublic 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();@Overridepublic 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.mzph.cn/news/98601.shtml

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

相关文章

【ARM CoreLink 系列 1 -- SoC 片上互联介绍】

文章目录 概述1.1 片上互连架构的发展1.1.1 BUS 共享总线结构1.1.2 Crossbar 结构1.1.3 Ring 结构1.1.4 Mesh 网格结构 1.2 ARM 总线互联特点小结1.2.1 NOC 总线互联的特点 下篇文章&#xff1a;【ARM CoreLink 系列 1.1 – CoreLink 系列 产品介绍】 概述 在摩尔定律的推动下…

【Linux基础】Linux的基本指令使用(超详细解析,小白必看系列)

&#x1f449;系列专栏&#xff1a;【Linux基础】 &#x1f648;个人主页&#xff1a;sunnyll 目录 &#x1f4a6; ls 指令 &#x1f4a6; pwd指令 &#x1f4a6;cd指令 &#x1f4a6;touch指令 &#x1f4a6;mkdir指令&#xff08;重要&#xff09; &#x1f4a6;rmdir指令…

智慧工地:数字革命下的建筑业新趋势

在当今建筑领域&#xff0c;智慧工地正迅速崭露头角。这个概念不仅代表了技术进步&#xff0c;还预示着建筑行业的数字化和智能化未来。从多个角度来看&#xff0c;智慧工地都具有深远的意义&#xff0c;它正在改变着我们建筑的方式和未来。 提高工程效率 智慧工地利用物联网&…

正点原子嵌入式linux驱动开发——Linux内核启动流程

上一篇笔记学习了Linux内核的顶层Makefile&#xff0c;现在来看Linux内核的大致启动流程&#xff0c;Linux内核的启 动流程要比uboot复杂的多&#xff0c;涉及到的内容也更多&#xff0c;因此本章就大致的了解一Linux内核的启动流程。 链接脚本vmlinux.lds 要分析Linux启动流…

2023年10月9日历史上的今天大事件早读

1740年10月09日红溪惨案 1874年10月09日万国邮政联盟成立 1912年10月09日第一次巴尔干战争爆发 1913年10月09日武昌起义元勋蒋翊武被害 1924年10月09日近代翻译家林纾(林琴南)逝世 1934年10月09日南斯拉夫国王遇刺身亡 1936年10月09日红军三大主力会师 1941年10月09日第…

电子招标投标系统 —采购招投标管理一体化系统-

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

SSL证书一次性购买多年期,有什么好处?

根据国际标准要求&#xff0c;2020 年 9 月 1 日起&#xff0c;全球信任的SSL证书最长有效期不能超过一年&#xff08;398天&#xff09;。一方面SSL证书有效期缩短可以大大提升SSL证书的安全性&#xff0c;但另一方面也意味着&#xff0c;用户每年都需要重复采购、付款、验证等…

数据重整:用Java实现精准Excel数据排序的实用策略

摘要&#xff1a;本文由葡萄城技术团队原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在数据处理或者数据分析的场景中&#xff0c;需要对已有的数据进行排序&#xff0c;在E…

什么是基于意图的网络(IBN)

基于意图的网络是一种网络技术&#xff0c;它根据业务意图&#xff08;来自网络管理员的服务请求&#xff09;配置 IT 基础架构&#xff0c;无需任何人工干预&#xff0c;它不断提供关键的网络见解&#xff0c;并不断调整硬件配置以确保满足意图&#xff0c;它将网络从以设备为…

【重拾C语言】七、指针(一)指针与变量、指针操作、指向指针的指针

目录 前言 七、指针 7.1 指针与变量 7.1.1 指针类型和指针变量 7.1.2 指针所指变量 7.1.3 空指针、无效指针 7.2 指针操作 7.2.1 指针的算术运算 7.2.2 指针的比较 7.2.3 指针的递增和递减 7.3 指向指针的指针 前言 指针是C语言中一个重要的概念正确灵活运用指针 可…

机器学习笔记 - 两个静态手势识别的简单示例

一、关于手势识别 手势识别方法通常分为两类:静态或动态。 静态手势是那些只需要在分类器的输入处处理单个图像的手势,这种方法的优点是计算成本较低。动态手势需要处理图像序列和更复杂的手势识别方法。 进一步了解可以参考下面链接。 静态手势识别和动态手势识别的区别和技…

【MATLAB源码-第43期】基于matlab的turbo码误码率仿真比较不同迭代次数,采用logmap/sova算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Turbo码是一种前向纠错码 (Forward Error Correction, FEC)&#xff0c;在 1993 年由法国的两位研究员 Claude Berrou 和 Alain Glavieux 提出。这种编码技术以其接近 Shannon 极限的高性能而受到广泛关注。以下是关于 Turbo…

手摸手系列之批量修改MySQL数据库所有表中某些字段的类型

在迁移老项目的数据库时&#xff0c;使用Navicat Premium的数据传输功能同步了表结构和数据。但是&#xff0c;发现某些字段的数据类型出现了错误&#xff0c;例如&#xff0c;租户ID从Oracle的NUMBER类型变成了MySQL的decimal(10)&#xff0c;正确的应该是bigInt(20)。此外&am…

这道面试题工作中经常碰到,但 99% 的程序员都答不上来

小时候都被问过一个脑筋急转弯&#xff0c;把大象放进冰箱有几个步骤&#xff1f;我们一开始都会抓耳挠腮&#xff0c;去想着该如何把大象塞进冰箱。最终揭晓的答案却根本不关心具体的操作方法&#xff0c;只是提供了 3 个步骤组成的流程&#xff0c;「把冰箱打开&#xff0c;把…

【力扣每日一题】2023.10.7 股票价格跨度

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一个数组表示不同时间的股票的价格&#xff0c;要我们按照顺序返回每天的股票价格跨度&#xff0c;价格跨度就是股票价格小于或等于…

[python 刷题] 76 Minimum Window Substring

[python 刷题] 76 Minimum Window Substring 题目&#xff1a; Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If there is no …

voc数据集格式与yolo数据集格式的区别及相互转化

Pascal VOC数据集是目标检测领域最常用的标准数据集之一&#xff0c;几乎所有检测方向的论文都会给出其在VOC数据集上训练并评测的效果。VOC数据集包含的信息非常全&#xff0c;它不仅被拿来做目标检测&#xff0c;也可以拿来做分割等任务&#xff0c;因此除了目标检测所需的文…

2023高交会“创新驱动发展·智慧赋能未来”招商工作已接近尾声

第二十五届中国国际高新技术成果交易会&#xff08;简称“高交会”&#xff09;将于2023年11月15日至19日在深圳会展中心举行。本届高交会以“创新驱动发展智慧赋能未来”为主题&#xff0c;聚焦战略性新兴产业和未来产业&#xff0c;集中展示中国高新技术成果和创新实力。 作为…

androidStudio第一次运行报错无法运行

安卓第一次运行失败 大家好&#xff0c;我使用androidStudio新建了一个测试demo第一次运行&#xff0c;结果失败了&#xff0c;显示如下图&#xff1a; 然后查了各种方法&#xff0c;都是没有用&#xff0c;最后 历经困难&#xff0c;还是找到了&#xff0c;原来是 gradle的依…

Python 无废话-办公自动化Excel格式美化

设置字体 在使用openpyxl 处理excel 设置格式&#xff0c;需要导入Font类&#xff0c;设置Font初始化参数&#xff0c;常见参数如下&#xff1a; 关键字参数 数据类型 描述 name 字符串 字体名称&#xff0c;如Calibri或Times New Roman size 整型 大小点数 bold …