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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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;
};
但是代码结构就得改。。那么也不符合题目给的过程。。
来个大神把这线程停了。。;

1 个回复

倒序浏览
你写个else条件语录然后break不就行了
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马