黑马程序员技术交流社区

标题: 线程的基本问题 [打印本页]

作者: java234    时间: 2016-8-29 20:06
标题: 线程的基本问题
编写程序,完成模拟3个窗口共卖100张票的程序,并测试。
作者: 梦想的小草    时间: 2016-8-29 20:40
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();
       
        }

}
作者: finally    时间: 2016-8-29 20:43
{:3_46:}二楼大神
作者: DaoDao2    时间: 2016-8-29 23:46
好高深的题目
作者: gohw007    时间: 2016-8-29 23:54
大神啊啊
作者: XinMingMing    时间: 2016-8-30 08:42
额,这个毕向东视频上面有吧
作者: yuanxianzhi    时间: 2016-8-30 13:59
还没看到那里 观摩观摩
作者: caoshenv5    时间: 2016-8-30 15:32
楼主真帅,谢谢分享
作者: java234    时间: 2016-8-30 21:40
梦想的小草 发表于 2016-8-29 20:40
public class Ticket extends Thread {
        private int ticket = 100;

6666666666666666666666666666666666666
道友道行高深,修为深厚!
作者: java234    时间: 2016-8-30 22:26
caoshenv5 发表于 2016-8-30 15:32
楼主真帅,谢谢分享


作者: java234    时间: 2016-8-30 22:27
DaoDao2 发表于 2016-8-29 23:46
好高深的题目


作者: DaoDao2    时间: 2016-8-30 23:58
厉害厉害
作者: xh_javaee    时间: 2016-8-31 01:36

/**
* 票务类,单例实例
*/
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();
        }

}

作者: java234    时间: 2016-9-1 22:05
梦想的小草 发表于 2016-8-29 20:40
public class Ticket extends Thread {
        private int ticket = 100;


作者: java234    时间: 2016-9-1 22:08
finally 发表于 2016-8-29 20:43
二楼大神

6666666666666666666666666666666666666666666666666666666666666666666
作者: Esen    时间: 2016-9-1 22:09
写的不错
作者: java234    时间: 2016-9-1 22:09
gohw007 发表于 2016-8-29 23:54
大神啊啊






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2