Java怎么实现站点售票功能
发表于:2025-11-15 作者:千家信息网编辑
千家信息网最后更新 2025年11月15日,本篇内容主要讲解"Java怎么实现站点售票功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现站点售票功能"吧!题目要求我们创建5个线程来模
千家信息网最后更新 2025年11月15日Java怎么实现站点售票功能
本篇内容主要讲解"Java怎么实现站点售票功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现站点售票功能"吧!
题目要求我们创建5个线程来模拟卖票,当然这其中就包含多线程存在也就是我们要解决的问题,重复卖票和超额卖票。即多个窗口卖出同一张票以及窗口卖出非正数编号的票。
不过这个问题可以先放一下,我们先来创建基础的线程模型,并在主方法中创建五个线程让他们跑起来
话不多说,上代码。
public class Ticket { public static void main(String[] args) { for(int i = 1;i <= 5;i++) { //创建5个线程并启动他们 //注意一定要使用Thread类创建线程并使用start方法启动 //而不是直接创建TicketSeller对象调用run方法!!!!!! new Thread(new TicketSeller(i)).start(); } }}//售票类,实现Runnable接口,可以作为线程执行对象class TicketSeller implements Runnable{ //该售票窗口编号 private int code; public TicketSeller(int code) { this.code = code; } @Override public void run() { for(int i = 0;i < 5;i++) { System.out.println(code + "号窗口"); //为了使线程能够交替执行,打印完成语句让线程休眠一小会 try { Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } }}完成了基础的多线程框架搭建后,我们来为每个线程执行过程中加入卖票的程序
首先要解决的一个问题是:票存在哪里?。毋庸置疑的是由于是多线程并发的售票,因此票这个变量一定是被多个线程所共享的,而不能是每个线程对象自己的属性。
一个可行的方案是在TicketSellet类中定义静态的票计数,这样所有的线程访问票的时候访问的都是同一个票计数变量。
另一个可行方案是使用一个对象管理票,票计数是这个对象的成员,并且让每个TicketSeller持有相同的对象。那么多个线程也同样共享票计数。
当然,可行的方案还有很多,现在我们先来实现第一种,在之后的改进中,我们还会用到第二种。
先来一个没有加锁的写法,看看他的问题
//售票类,实现Runnable接口,可以作为线程执行对象class TicketSeller implements Runnable{ //票数 private static int tickets = 100; //该售票窗口编号 private int code; public TicketSeller(int code) { this.code = code; } @Override public void run() { //如果有票就一直卖 while(tickets > 0) { System.out.println(code + "_____" + tickets--); //卖过票之后休眠一小会等待其他线程操作 try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }三、完整代码:
public class Ticket { public static void main(String[] args) { for(int i = 1;i <= 5;i++) { //创建5个线程并启动他们 //注意一定要使用Thread类创建线程并使用start方法启动 //而不是直接创建TicketSeller对象调用run方法!!!!!! new Thread(new TicketSeller(i)).start(); } }}//售票类,实现Runnable接口,可以作为线程执行对象class TicketSeller implements Runnable{ //票数 private static int tickets = 100; //同步锁 private static Object lock = new Object(); //该售票窗口编号 private int code; public TicketSeller(int code) { this.code = code; } @Override public void run() { //如果有票就一直卖 while(tickets > 0) { synchronized (lock) { //如果票卖完了则跳出 if(tickets <= 0) { break; } System.out.println(code + "_____" + tickets--); //卖过票之后休眠一小会等待其他线程操作 try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }在前面我们还提出了另一种方案,就是使用一个对象管理票的售卖。这种方案就不展开啰嗦了,直接上代码:
public class Ticket { public static void main(String[] args) { //创建一个票管理对象,票数为100 TicketSet ts = new TicketSet(100); //创建5个线程,使用同一个票管理对象 for(int i = 1;i <= 5;i++) { new Thread(new TicketSeller(ts, i)).start(); } }}//票管理类class TicketSet{ //票数 private int tickets; public TicketSet(int tickets) { this.tickets = tickets; } private boolean hasTicket() { return tickets > 0; } //售票方法,使用同步锁,每次只能有一个线程访问该方法 //返回结果为是否卖出去票 synchronized public boolean sellTicket(int code) { if(hasTicket()) { System.out.println(code + "_____" + tickets--); return true; }else { return false; } }}//售票类class TicketSeller implements Runnable{ //票管理对象 private TicketSet ts; private int code; public TicketSeller(TicketSet ts,int code) { this.ts = ts; this.code = code; } @Override public void run() { //尝试调用票管理的售票方法,售票成功后休眠一小会 while(ts.sellTicket(code)){ try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}到此,相信大家对"Java怎么实现站点售票功能"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
线程
售票
对象
方法
管理
方案
问题
休眠
卖票
功能
站点
可行
多个
先来
代码
内容
变量
基础
接口
票数
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网公司网络安全
如何获得网页数据库
杭州猎文网络技术有限公司
软件开发外包的缺点
网络安全异常第二梯队的应用
济宁软件开发制作
崩坏学园服务器怎么换
ras服务器管理错误
大多数软件开发项目都采用
网络安全股源
魔兽世界没有服务器
2020年amd服务器主板
kawaks如何不用服务器联机
互联网车险评价科技公司
网络技术中vlan10怎么弄
公共信息网络安全检查
计算机网络技术路由器配置
政府网络安全员
如何监控软件开发项目进度表
resset数据库日期重复
点睛互联网科技公司
扫描数据库漏洞时用到的脚本
无法访问本地数据库
数据库 匹配 长字符
数据库相关技术和能力的三大公司
vb 连接sql数据库
关于面试软件开发的一些问题
一图读懂民法典中的网络安全
惠普服务器cpu灯亮
未来10年网络安全系数