票真难买呀,咋回个家就怎么难呢?
这几天学习了下线程,加上买票的事,就写了个模拟售票窗口买票的问题:有四个窗口对顾客售票,一个顾客只能买一张票.
1.Consumer类
/**
* 顾客
* @author xpery
*
*/
public class Consumer implements Runnable {
private Ticket ticket;
public Consumer(Ticket ticket){
this.ticket= ticket;
}
public void run() {
while(true){
ticket.getConsumer();
if(ticket.ticketNum<=0){
System.out.println("售票窗口已关闭,请明天再来!");
break;
}
}
}
}
2.Windows类
/**
* 窗口
* @author Xpery
*
*/
public class Windows implements Runnable {
private Ticket ticket;
public Windows(Ticket ticket){
this.ticket = ticket;
}
public void run() {
while (true) {
ticket.saleTicket();
if(ticket.ticketNum<=0){
System.out.println("关闭售票窗口"+Thread.currentThread().getName());
break;
}
}
}
}
3.Ticket类
import java.util.Vector;
public class Ticket {
// 总票数
public int ticketNum = 100;
// 是否有顾客
private boolean isConsumer = false;
private Vector<Integer> numVector = new Vector<Integer>();
/**
* 售票
*/
public synchronized void saleTicket() {
// 是否有顾客,没有就等待
if (!isConsumer) {
try {
wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
if (ticketNum > 0) {
System.out.println(Thread.currentThread().getName() + "卖给"
+ getConsumerName() + "一张票,票号为:" + ticketNum-- + "票");
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
isConsumer = false;
notify();
}
/**
* 获取顾客
*/
public synchronized void getConsumer() {
// 是否有顾客,有就等待
if (isConsumer) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 判断票是否已经售完
if(ticketNum==0){
System.out.println("对不起,今天的票已售完,请明天早点来!");
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
isConsumer = true;
notify();
}
/**
* 获取顾客名称
* @return
*/
public String getConsumerName() {
int num = Integer.valueOf((int)(Math.random() * 999 + 1));
String consumerName="顾客" + num;
// 判断是否有人重复买票
while (numVector.contains(num)) {
System.out.println("对不起,"+consumerName+" ,您已经买了一张票,不能再买一张了");
num = Integer.valueOf((int)(Math.random() * 999 + 1));
}
numVector.add(num);
return consumerName;
}
}
4.主程序:MianTest
public class MianTest {
public static void main(String[] args) {
Ticket ticket = new Ticket();
/**
* 产生一个顾客对象,用来获取顾客
*/
Consumer consumer = new Consumer(ticket);
Thread threadConsumer = new Thread(consumer);
threadConsumer.start();
/**
* 产生四个窗口
*/
Windows windows = new Windows(ticket);
for (int i = 1; i < 5; i++) {
Thread threadWindows = new Thread(windows);
threadWindows.setName(i + "号窗口");
threadWindows.start();
}
}
}
由于本人能力有限,程序可能会有错误,还请各位多多指点,小弟在这先谢谢了。
分享到:
相关推荐
本文将详细介绍如何利用VHDL(VHSIC Hardware Description Language,超高速集成电路硬件描述语言)来设计一个地铁售票模拟系统,该项目不仅作为通信线路EDA(Electronic Design Automation,电子设计自动化)课程的...
这里面包含四个小程序,分别是二叉树染色问题,根据二叉树的先序遍历和中序遍历求出后序遍历,利用队列的保存顺序特性,模拟售票口服务解决实际问题,用递归算法解决分局自问题,这四个程序都是完整的小程序,希望能...
毕业设计是高等教育阶段学生在完成学业前所进行的一项重要学术任务,旨在检验学生通过学习所获得的知识、技能以及对特定领域的深刻理解能力。这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个...
这个例子“07-01 三个售票窗口同时出售20张票(并发)”旨在探讨如何在多线程环境下实现并发销售,特别是针对售票系统的场景。在这样的系统中,并发处理能提高效率,但同时也引入了数据一致性的问题。 并发是指多个...
自动售票机通常包含以下组件:触摸屏显示器、现金接受器(包括纸币识别器和硬币识别器)、出票口、找零口以及各种按钮和指示灯。用户通过触摸屏选择目的地、购票数量,然后投入相应的货币或使用电子支付方式,ATVM会...
它在日常生活中的体现无处不在,从火车站的检票口、食堂的队伍,到学校健康检查的排队,乃至在线下载文件的过程,都蕴含着排队现象。在专业领域,尤其是在计算机网络、通信、交通及公共服务中,排队理论的应用日益...
本篇文章将介绍四个基于FPGA(Field Programmable Gate Array,现场可编程门阵列)的数字系统设计题目,包括密码锁控制器、多功能电子表、自动售货机和地铁售票模拟系统的设计要求和功能细节。 首先,我们来看密码...
- **定义资源**:车站、售票窗口、检票口等为有限的资源。 - **定义流程**:乘客从到达、排队、登记到离开的过程。 - **设置参数**:包括平均到达率、服务时间、容量限制等。 4. **输出数据**:仿真的输出通常...
在站台、站厅、自动扶梯、部分机房、变电所变压器室、10KV开关柜室、AFC的售票机和闸机、出入口、垂直电梯口及轿厢、出入段线、平交道口及轨行区、停车列检库内外、洗车库等重要公共区域,通过选择不同种类的摄像...
- 检票口条屏显示故障处理:能够快速识别并联系厂家进行故障处理。 - 售票厅大屏硬件故障处理:及时发现并跟踪解决硬件故障问题。 4. **弱电设备供电系统排查**: - 熟悉强电开关位置,确保设备的正常供电。 ##...
A、模拟信息 B、模拟信息或数字信息 C、数字形式D、二进制形式的数字 6.在Windows98中,要恢复回收站中的文件,只要___B____。 A、双击该文件 B、用鼠标把该文件施出回收站 C、单击该文件 D、A、B、C均可 7.在...