/*5、编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。
* 售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。
* 耗时:
* 状态:
* 代码效率:
* 思路分析:
* 1.新建一个售票中心,设置一个有参方法,当做参数用 这个在窗口类中也定义成静态的 方便传参.
* 把所有的售票信息存入到集合中.
* 集合在售票窗口张定义为静态的成员变量,每卖一张,就去掉一个索引.
* 窗口中心定义为一个线程的实现类.
* */
public class 售票中心_窗口和信息 {
public static void main(String[] args) {
// 创建一个票务中心,并传入参数进去.
TicketSealCenter tsc = new TicketSealCenter(50);
// 创建窗口
SealWindow sw1 = new SealWindow();
SealWindow sw2 = new SealWindow();
SealWindow sw3 = new SealWindow();
SealWindow sw4 = new SealWindow();
sw1.setName("窗口一");
sw2.setName("窗口二");
sw3.setName("窗口三");
sw4.setName("窗口四");
sw1.start();
sw2.start();
sw3.start();
sw4.start();
}
}
// 售票中心
class TicketSealCenter {
private int num;
public TicketSealCenter(int num) {
super();
this.num = num;
}
public TicketSealCenter() {
super();
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
// 定义票务信息类
class Ticket {
private int name;// 车厢号
private int seat;// 座位号
public Ticket(int name, int seat) {
super();
this.name = name;
this.seat = seat;
}
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public int getSeat() {
return seat;
}
public void setSeat(int seat) {
this.seat = seat;
}
}
/*
* 售票窗口
*/
class SealWindow extends Thread {
// static Ticket t = new Ticket(name, seat);//我怎样把这个票务信息的集合传过来?
static TicketSealCenter tsc = new TicketSealCenter(120);
static int num = tsc.getNum();//获取传入的票数
static int bb = num;
static List<String> b = new ArrayList<>();
/*这里面涉及到一个代码的执行顺序
* 静态是随着类的加载而加载,构造方法和构造代码块是在静态代码执行完后,才执行
* 默认初始化,和显性初始化,默认初始化,是随着类的加载就已经初始化了,显性初始化,是当执行到这句话的时候,才初始化.
* */
public SealWindow() {
getNum();
}
public void run() {
int count = 0;
while (true) {
synchronized(tsc){
if (num <= 0) {
break;
}
count++;
System.out.println(Thread.currentThread().getName() + "卖出了第"
+ count +"张票."+ "\r\n"+b.get(0));
b.remove(0);
num--;
try {
Thread.sleep(30);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName() + "窗口,共计卖出了:"
+ count + "张票");
}
// 创建票务信息: 这个票务信息必须是静态和全局共享的,卖一张少一张.
/*
* 先要把集合存满元素.
*/
public static void getNum() {// b,表示有多少张票,就有多少张票务信息
Ticket t = new Ticket(8, 110);// 第一个是车车厢数,第二个是作为数
// List<String> list =
//int bb = 50;
outer: for (int i = 1; i <= t.getName(); i++) {// 第一层循环控制箱数
inner: for (int j = 1; j <= t.getSeat(); j++) {// 第层循环控制的是每箱的座位数.
b.add("\t" + "票务信息为:" + "\r\n" + "\t" + "第" + i + "车,"
+ "座位号:" + j);
bb--;//这里减减了,那边就没票了
if (bb <= 0) {
break outer;
}
}
}
//System.out.println(list);
//return list;
}
|
|