Java怎么实现站点售票功能
发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,本篇内容主要讲解"Java怎么实现站点售票功能",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java怎么实现站点售票功能"吧!题目要求我们创建5个线程来模
千家信息网最后更新 2024年09月25日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安全错误
数据库的锁怎样保障安全
北大青鸟计算机软件开发视频
自学软件开发从零开始
航空行业标准数据库系统
数据库应用系统技术第四章答案
西门子s7400服务器更换
日常活动管理数据库
jpa查询数据库
服务器用什么显示器
什么是数据库客户端
湖北服务器硬盘维修
原生sql连接数据库
校园网网络安全维护策略
数据库审计系统可以通过
软件开发员真诚征婚
东软医疗软件开发
服务器网络安全如何设置
数据库统计字段相同值
湖湘杯2020网络安全报名
奉贤区手机软件开发流程
浙江学习软件开发平台
网络安全培训培训
steam中国cm服务器停服
安全的联想ibm服务器
南京白鸥网络技术
网吧服务器 NIC组合
网络技术招生短视频
亚马逊数据库专业课程
东软医疗软件开发
数据库管理技术的建议
数据库的用户和角色的设置