黑马程序员技术交流社区

标题: 又见买票。谁能把它停下来。。。 [打印本页]

作者: poi1234bnm    时间: 2016-12-1 22:49
标题: 又见买票。谁能把它停下来。。。
package no2;

import java.util.ArrayList;
import java.util.List;

public class SealTicket {

        /**
         * 13、编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。(出售100张票)
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                Ticket ticket = new Ticket();
               
                TicketSealCenter tsc = new TicketSealCenter(ticket);
                SealWindow sw= new SealWindow(ticket);
               
                Thread t = new Thread(tsc);
                Thread t1 = new Thread(sw);
                Thread t2 = new Thread(sw );
                Thread t3 = new Thread(sw );
                Thread t4 = new Thread(sw );
               
                t1.setName("一号窗口");
                t2.setName("二号窗口");
                t3.setName("三号窗口");
                t4.setName("四号窗口");
               
                t.start();
                t1.start();
                t2.start();
                t3.start();
                t4.start();
               
        }
}
class Ticket{
        private List<Integer > list = new ArrayList<Integer>();
        int tnum  =0 ;
       
        //出售
        public synchronized void   get() {
                while(list.size()<1){
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
               
                System.out.println(Thread.currentThread().getName()+"出售第"+list.get(0)+"还有"+(list.size()-1));
                if(list.get(0)>100){
                        list.remove(0);
                        return ;
                }
                list.remove(0);
                this.notifyAll();
               
        }
        //生产
        public synchronized void set() {
                if(tnum >99){
                        return ;
                }
                while(list.size()>5){
                        try {
                                this.wait();
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                }
                System.out.println("生产第"+ ++tnum +"张票");
                list.add(tnum );
                this.notifyAll();
        }
}
class SealWindow implements Runnable{
        Ticket ticket ;
        public SealWindow(Ticket t) {
                super();
                this.ticket = t;
        }
        @Override
        public void run() {
                // TODO Auto-generated method stub
                while(true){
                        ticket.get();
                }
        }
       
}
class  TicketSealCenter implements Runnable{

        Ticket ticket ;
        public TicketSealCenter(Ticket t) {
                super();
                this.ticket = t;
        }
        @Override
        public void run() {
                // TODO Auto-generated method stub
                while(true){
                        ticket.set();
                }
        }
}

结果:
...
...
...
一号窗口出售第96还有0
生产第97张票
四号窗口出售第97还有0
生产第98张票
一号窗口出售第98还有0
生产第99张票
生产第100张票
四号窗口出售第99还有1
四号窗口出售第100还有0

如果觉得这程序真的停下来了。。那就错了。。运行的时候你会发现你console窗口小红框没有变灰。。程序并没有真的停下来。。这里求一个可以把程序停下来的方案。。
C:\Users\Administrator.SC-201607071737\Desktop
当然没有那层
public void run() {
                // TODO Auto-generated method stub
                while(true){
                        ticket.get();
                }
}倒是好办。
可以直接
if(tnum >99){
        break;
};
但是代码结构就得改。。那么也不符合题目给的过程。。
来个大神把这线程停了。。;
作者: tanbang1    时间: 2016-12-2 01:34
你写个else条件语录然后break不就行了





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