谢谢哈,哥们你的代码比我的号,我有写了一次,还是没用使用同步但是感觉有漏洞,再看看哈- package com.itheima;
- /*第5题: 编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息
- * 、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,
- * 利用你所学的线程知识来模拟此售票过程。
- *
- * 需求分析:Ticket包含有票名和票号,String name和int id
- * TicketSealCenter是唯一的,采用单例模式设计,有makeTickets生产票方法其接收三个参数分别是票名、票数、以及票号,
- * 和putTickets分配票方法。
- * SealWindow实现Runnable接口,覆盖run方法,构造函数接受String窗口名称以及Ticket[] tickets票数
- */
- import java.util.ArrayList;
- public class Test5 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- TicketSealCenter tsl=TicketSealCenter.getInstance();
- //生产100张编号从1开始的"上海---北京"的票
- tsl.makeTickets("上海---北京", 100,1);
- //获取编号从1开始的"上海---北京"的100张票
- Ticket[] tickets1=tsl.putTickets();
-
- //生产100张编号从101开始的"上海---北京"的票
- tsl.makeTickets("上海---北京", 100,101);
- //获取编号从101开始的"上海---北京"的100张票
- Ticket[] tickets2=tsl.putTickets();
-
- //生产100张编号从201开始的"上海---北京"的票
- tsl.makeTickets("上海---北京", 100,201);
- //获取编号从201开始的"上海---北京"的100张票
- Ticket[] tickets3=tsl.putTickets();
-
- //创建三个卖票窗口每个窗口分配100张票
- SealWindow sealWindow1=new SealWindow("1号窗口",tickets1);
- SealWindow sealWindow2=new SealWindow("2号窗口",tickets2);
- SealWindow sealWindow3=new SealWindow("3号窗口",tickets3);
- //开启三个窗口线程开始卖票
- new Thread(sealWindow1).start();
- new Thread(sealWindow2).start();
- new Thread(sealWindow3).start();
- }
- }
- class SealWindow implements Runnable{
- private String windowName;
- private Ticket[] tickets;
-
- public SealWindow(String windowName,Ticket[] tickets){
- this.windowName=windowName;
- this.tickets=tickets;
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- // 获取每个窗口的总票数
- int num=tickets.length;
- for(int i=0;i<tickets.length;i++){
-
- //下面文档注释可有可无,只是为了更为直观的观看测试结果的准确性而写的代码
- /*try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
-
- e.printStackTrace();
- }*/
- //此处创建一个StringBuilder是为了把剩余的票数放进字符串缓冲区里变成字符串打印出来,方便观看结果
- //当然,如果不需要获得剩余的票数,此处StringBuilder以及放进StringBuilder的数据都可以不写
- StringBuilder sb=new StringBuilder();
- sb.append(num-1);
- System.out.println(windowName+"卖出了一张 "+tickets[i]+"...剩下"+sb.toString()+"票");
- //清空缓冲区
- sb.delete(0, 1);
- //每卖一张票就减少一张票
- num=num-1;
- }
-
- /*for(Ticket ticket:tickets)
- System.out.println(windowName+"卖出了:"+ticket);*/
- }
-
- }
- class TicketSealCenter{
- private TicketSealCenter(){}
- private static TicketSealCenter tsl = new TicketSealCenter();
- public static TicketSealCenter getInstance() {
- return tsl;
- }
- private Ticket[] tickets;
- //makeTickets方法接收三个参数分别是票名、票数、以及票号
- public void makeTickets(String ticketName,int number,int id){
- ArrayList<Ticket> al= new ArrayList<Ticket>();
- //tickets=new Ticket[number];
- for(int i=1;i<=number;i++){
- //遍历票数生产对应的票
- Ticket ticket=new Ticket(ticketName,id++);
- al.add(ticket);
- tickets=al.toArray(new Ticket[al.size()]);
- }
- }
- public Ticket[] putTickets(){
- return tickets;
- }
-
- }
- class Ticket {
- private String name;
-
- private int id ;
- Ticket(String name, int id) {
-
- this.name = name;
-
- this.id = id;
-
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
-
- public String toString() {
- return this.name + "的票,票号为" + this.id;
- }
- }
复制代码 |