A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

/*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;
        }

2 个回复

正序浏览
回复 使用道具 举报
线程难吗
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马