Java练习1--模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程

本文主要是介绍Java练习1--模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

面向对象的一个小程序,觉着还不错,记录一下
练习要求:
实验要求:
(一)编写一个程序,程序模拟某电影院三个售票窗口同时出售电影票的过程。
1. 电影票顺序出售,程序模拟显示售票的详细过程(如:“窗口X出售编号XXX电影票”)。
2. 三个窗口同时出票,出票间隔采用随机控制。
3. 不能重复出售相同的电影票。
程序应具有良好的人机交互性能,即:程序应向用户提示功能说明,并可根据用户的功能选择,执行对应的功能,并给出带详细描述信息的最终执行结果。
(二)扩展以上程序, 模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程。

具体的过程注释都在代码中有标记。
小tips:
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

当两个并发线程(thread1和thread2)访问同一个对象(syncThread)中的synchronized代码块时,在同一时刻只能有一个线程得到执行,另一个线程受阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块。Thread1和thread2是互斥的,因为在执行synchronized代码块时会锁定当前的对象,只有执行完该代码块才能释放该对象锁,下一个线程才能执行并锁定该对象。

下面是具体代码(可执行核心代码):
如果想要继续丰富界面,加上互动即可

/*** 1.为了使电影票顺序出票且不重复,使用了同步锁保证电影票的同时而且按顺序输出* 2.为了使出票间隔随机控制,我使用了随机函数,生成随机时间(范围是0到1秒)* @author QingBang.Wang* @DATE 2019/5/30*/
public class Ticket{public static void main(String[] args) {/*** 实例化线程对象*/Station station1 = new Station("窗口一");Station station2 = new Station("窗口二");Station station3 = new Station("窗口三");/*** 开始运行*/station1.start();station2.start();station3.start();}
}class Station extends Thread {//设置静态票数static int ticket = 50;//设置线程锁static Object ob = "ThisIsATicket";//给线程命名public Station(String name) {super(name);}//写run方法public void run() {sell();}//售卖方法public void sell() {while (ticket > 0) {synchronized (ob) {					//ob相当于一个钥匙/*** 使用同步锁控制票*/if (ticket > 0) {//窗口三有二分之一的可能是退票if (getName().equals("窗口三") && Math.random() > 0.5 && ticket < 50) {ticket++;System.out.println("退票第" + ticket + "张票");} else {System.out.println(getName() + "卖了第" + ticket + "张票");ticket--;}} else {System.out.println("很抱歉,票卖完了");}}/*** 让线程休眠时间随机*/try {sleep((long) (1000 * Math.random()));} //休息一秒catch (Exception e) {e.printStackTrace();}}}
}

下面是运行结果:
在这里插入图片描述

这篇关于Java练习1--模拟某电影院三个售票窗口同时出售电影票,一个售票窗口可进行退票的过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750395

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA