题干
《面向对象程序设计》课程设计题目
第 3 题 多线程编程---模拟多窗口售票
【涉及知识点】
1、掌握Java 多线程结构和开发过程;
2、了解多线程生命周期和运行机制;
3、掌握线程之间的数据共享;
4、掌握线程之间的同步方法。
【题目介绍】
电影《拆弹专家2》即将上映,电影院某一场次现有100张票要卖出,观众可以通过四个渠道购票:
电影院、时光网、美团和支付宝。
【功能要求】
1、此电影放映厅一共有10排,每排10个座位,座位号为“排号+列号”,如第8排,座位号是8A-8J;
2、各个售票点的效率不同,每卖出一张票,各个售票点所需要的时间分别为:
电影院3秒,时光网5秒,美团2秒,支付宝6秒;
3、现在这4个售票点同时售票,用多线程模拟这4个售票点的售票情况。
要求打印出每个售票点所卖出电影票的座位号,座位号随机确定。
注意:各售票点不能售出相同座位号的电影票。
saleTickets
package com.xbmu.SaleTicket;
import java.util.Random;
public class saleTicket extends Thread{
static String seat[][] = new String[15][15];//存储座位号的集合
static int ticketNum = 100;//初始化座位总数
static Object ob = new Object();
Random number = new Random();//随机生成座位号索引
static boolean state[][] = new boolean[15][15];//记录座位号是否已卖出
public static void main(String[] args) {
//先合成座位号
getSeat();
//实例化窗口对象,并为每一个窗口定义名字
saleTicket window01 = new saleTicket("电影院");
saleTicket window02 = new saleTicket("时光网");
saleTicket window03 = new saleTicket("美团");
saleTicket window04 = new saleTicket("支付宝");
//开启线程
window01.start();
window02.start();
window03.start();
window04.start();
}
//合成100个座位号的方法
public static void getSeat(){
String [] row = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10"};//行编号
String [] list = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"};//列编号
for (int i = 0; i < 10; i ++){
for (int j = 0; j < 10; j ++) {
seat[i][j] = row[i] + list[j];
}
}
}
//给线程名字赋值
public saleTicket(String name){
super(name);
}
//售票窗口卖票时间
public void sleepTime(){
if (getName().equals("电影院")){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if (getName().equals("时光网")){
try {
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if (getName().equals("美团")){
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if (getName().equals("支付宝")){
try {
sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//重写run()方法卖票
@Override
public void run(){
while (ticketNum > 0){
sleepTime();
synchronized (ob){
if (ticketNum > 0){
int i, j;
while (true) {
i = number.nextInt(10);//随机生成座位号索引
j = number.nextInt(10);//随机生成座位号索引
if (!state[i][j]) break;
}
System.out.println(getName() + " 卖出了一张座位号为 "
+ seat[i][j] + " 的票, 当前剩余票数: " + -- ticketNum + " 张\n");
state[i][j] = true;
}else {
System.out.printf("票已全部卖完.");
}
}
}
}
}