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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java234 中级黑马   /  2016-8-29 20:06  /  971 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

编写程序,完成模拟3个窗口共卖100张票的程序,并测试。

16 个回复

倒序浏览
public class Ticket extends Thread {
        private int ticket = 100;

        public void run() {
                while (true) {
                        synchronized (this) {
                                if (ticket <= 100 && ticket > 0) {
                                        System.out.println(Thread.currentThread().getName() + "抢到了第" + (ticket--) + "张票");
                                        try {
                                                Thread.sleep(500);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                } else {
                                        System.out.println("票以售完");
                                        break;
                                }
                        }
                }
        }
}

public class ticketTest {

        public static void main(String[] args) {
                Ticket tk = new Ticket();
                Thread t1 = new Thread(tk, "窗口一");
                Thread t2 = new Thread(tk, "窗口二");
                Thread t3 = new Thread(tk, "窗口三");
                t1.start();
                t2.start();
                t3.start();
               
                tk.setName("小白");
                tk.start();
       
        }

}
回复 使用道具 举报
{:3_46:}二楼大神
回复 使用道具 举报
好高深的题目
回复 使用道具 举报
大神啊啊
回复 使用道具 举报
额,这个毕向东视频上面有吧
回复 使用道具 举报
还没看到那里 观摩观摩
回复 使用道具 举报
caoshenv5 来自手机 中级黑马 2016-8-30 15:32:37
8#
楼主真帅,谢谢分享
回复 使用道具 举报
梦想的小草 发表于 2016-8-29 20:40
public class Ticket extends Thread {
        private int ticket = 100;

6666666666666666666666666666666666666
道友道行高深,修为深厚!
回复 使用道具 举报
caoshenv5 发表于 2016-8-30 15:32
楼主真帅,谢谢分享

回复 使用道具 举报
回复 使用道具 举报
厉害厉害
回复 使用道具 举报

/**
* 票务类,单例实例
*/
public class Ticket implements Runnable {
       
        private static Ticket sTicket;
       
        /**
         * 售票线程列表
         */
        private List<Thread> mThreads;
       
        /**
         * 窗口数量
         */
        private int mWindowNumber;
       
        /**
         * 预售数
         */
        private int mTicketNumber;
       
        /**
         * 余票
         */
        private int mResidueNumber;
       
        /**
         * 是否售完
         */
        private boolean isSaleOff = false;
       
        private List<String> mWindowNames = new ArrayList<String> ();
       
        /**
         * 私有化单例构造,预售票数和窗口数量
         * @param ticket
         * @param window
         */
        private Ticket(int ticket, int window) {
                initWindowNames();
                this.mTicketNumber = ticket;
                this.mResidueNumber = ticket;
                this.mWindowNumber = window;
                mThreads = new ArrayList<Thread> ();
                if(mWindowNumber > 0 && mWindowNumber <= 8) {
                        for(int i = 0;i < mWindowNumber;i++) {
                                mThreads.add(new Thread(this, mWindowNames.get(i)));
                        }
                } else {
                        mWindowNumber = 8;
                }
        }
       
        /**
         * 预设8个窗口
         */
        private void initWindowNames() {
                mWindowNames.add("学生窗口");
                mWindowNames.add("普通窗口1");
                mWindowNames.add("军人窗口");
                mWindowNames.add("普通窗口2");
                mWindowNames.add("老人窗口");
                mWindowNames.add("普通窗口3");
                mWindowNames.add("普通窗口4");
                mWindowNames.add("普通窗口5");
        }

        /**
         * 获取票务实例
         * @param ticket 预售票数
         * @param window 窗口数
         * @return
         */
        public static Ticket getTicketInstance(int ticket, int window) {
                if(sTicket == null) {
                        sTicket = new Ticket(ticket, window);
                }
                return sTicket;
        }
       
        /**
         * 开始售票
         */
        public void start() {
                for(int i=0;i<mWindowNumber;i++) {
                        mThreads.get(i).start();
                }
        }
       
        /**
         * 售票
         */
        private synchronized void saleTicket() {
                if(!isSaleOff) {
                        //有票,开卖
                        System.out.println("------------ 欢迎选择: " + Thread.currentThread().getName() + " ------------");
                        System.out.println("第 " + mResidueNumber +" 张票");
                        mResidueNumber--;
                        System.out.println("剩余票数:" + mResidueNumber + " 张");
                        System.out.println("--------------------------------------");
                        try {
                                Thread.sleep(50);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                } else {
                        //售完
                        System.out.println("亲,来晚了,没票了...");
                }
        }

        public void run() {
                while(!isSaleOff) {
                        if(mResidueNumber>0 && mResidueNumber<=mTicketNumber) {
                                //大于0,小于预售数量
                                saleTicket();
                        } else {
                                isSaleOff = true;//无票
                        }
                }
        }
       
}



public class MainClass {
       
        public static void main(String[] args) {
                Ticket ticket = Ticket.getTicketInstance(100, 3);//100张票,3个窗口
                ticket.start();
        }

}
回复 使用道具 举报
梦想的小草 发表于 2016-8-29 20:40
public class Ticket extends Thread {
        private int ticket = 100;

回复 使用道具 举报

6666666666666666666666666666666666666666666666666666666666666666666
回复 使用道具 举报
写的不错
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马