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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 攻城狮 黑马帝   /  2012-5-21 22:14  /  6100 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

线程练习
编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。

13 个回复

正序浏览
求教各位大神,为什么我的总是第一个线程就运行完了?

class Ticket{
        private static int ticketNum;

        public int getTicketNum() {
                return ticketNum;
        }

        public Ticket(int ticketNum){
                this.ticketNum=ticketNum;
        }
        public static  boolean available(){
                if(ticketNum>0){
                        return true;
                }
                else{
                        return false;
                }
        }
        public static  void sealTicket(String winName){               
                        System.out.println(winName+"-----恭喜您,您已完成票务购买-----");
                        System.out.println("还剩余"+(--ticketNum)+"张票");               
        }
}
class SealWindow implements Runnable {
        private String winName;
        private Ticket ticket;

        SealWindow(String winName,Ticket ticket){
                this.winName=winName;
                this.ticket=ticket;
        }
        public void run(){
                System.out.println("欢迎来到"+winName+"售票窗口,很高兴为您服务");
                synchronized(ticket){
                while(ticket.available()){
                                Ticket.sealTicket(winName);
                        }                                       
                }
                System.out.println("-----票已卖完,下次发售时间:明早8:00,欢迎届时购买-----");       
        }          
}       
public class Test7 {   //此处的Test7应该为TicketSealCenter,但是因为考试要求中的类名规范,特此说明

        public static void main(String[] args) {
                //售票中心 分配售票窗口 和总票数
                // 生产票 送到售票中心
                Ticket ticket = new Ticket(1000);
                //建立 3个售票窗口
                SealWindow sw1 = new SealWindow("售票窗口一",ticket);
                SealWindow sw2 = new SealWindow("售票窗口二",ticket);
                SealWindow sw3 = new SealWindow("售票窗口三",ticket);
               
                new Thread(sw2).start();
                new Thread(sw1).start();
                new Thread(sw3).start();
        }
}
回复 使用道具 举报
vipzh 中级黑马 2013-3-11 17:42:47
13#
本帖最后由 张号 于 2013-3-11 17:47 编辑

不知道为什么 总是只有一个线程运行
  1. //售票窗口
  2. public class SealWindow
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 new Thread(new TicketSealCenter(), "1号窗口").start();
  7.                 new Thread(new TicketSealCenter(), "2号窗口").start();
  8.                 new Thread(new TicketSealCenter(), "3号窗口").start();
  9.                 new Thread(new TicketSealCenter(), "4号窗口").start();
  10.                 new Thread(new TicketSealCenter(), "5号窗口").start();
  11.                 new Thread(new TicketSealCenter(), "6号窗口").start();

  12.         }

  13. }

  14. // 售票中心
  15. class TicketSealCenter implements Runnable
  16. {

  17.         private void sale() throws Exception
  18.         {
  19.                 Ticket ticket = new Ticket();
  20.                 // 售票中心分配火车票
  21.                 ticket.setTicketNum(10);

  22.                 while (ticket.isEmple())
  23.                 {

  24.                         System.out.println(Thread.currentThread().getName() + "售出一张"
  25.                                         + "还剩下" + ticket.getTicketNum() + "张票");

  26.                         if (ticket.getTicketNum() == 0)
  27.                         {
  28.                                 System.out.println("票已经卖完了,明天再来吧!!!");
  29.                         }

  30.                 }
  31.         }

  32.         @Override
  33.         public void run()
  34.         {
  35.                 try
  36.                 {
  37.                         //同步代码块
  38.                         synchronized (TicketSealCenter.class)
  39.                         {
  40.                                 sale();
  41.                                
  42.                         }
  43.                 }       
  44.                 catch (Exception e)
  45.                 {
  46.                         e.printStackTrace();
  47.                 }
  48.         }
  49. }

  50. // 火车票类
  51. class Ticket
  52. {

  53.         private int ticketNum; // 火车票张数

  54.         // 获得火车票的数量
  55.         public int getTicketNum()
  56.         {
  57.                 return ticketNum;
  58.         }

  59.         // 设置火车票数量
  60.         public void setTicketNum(int ticketNum)
  61.         {
  62.                 this.ticketNum = ticketNum;
  63.         }

  64.         // 判断是否有票
  65.         public boolean isEmple() throws Exception
  66.         {

  67.                 if (ticketNum > 0)
  68.                 {

  69.                         ticketNum--;
  70.                         Thread.sleep(1000);
  71.                         return true;
  72.                 }
  73.                 else
  74.                 {
  75.                         System.exit(0);
  76.                         return false;
  77.                 }
  78.         }

  79. }
复制代码
回复 使用道具 举报

  1. public class ThreadDemo {
  2.         public static void main(String[] args) {
  3.                 SailCenter sc = new SailCenter(200);
  4.                
  5.                 for(int i=0;i<4;i++) {
  6.                         new Thread(new SailWindow(sc)).start();
  7.                 }
  8.         }
  9. }

  10. class Tricket {
  11.         //do something!
  12. }



  13. class SailWindow implements Runnable{
  14.         SailCenter sc = null;
  15.         public SailWindow(SailCenter sc) {
  16.                 this.sc = sc;
  17.         }
  18.        
  19.         public void run() {
  20.                 while(true) {
  21.                         int id = sc.sail();
  22.                         System.out.println(Thread.currentThread().getName() + "sailed Num." + id );
  23.                         try {
  24.                                 Thread.sleep(1000 * 1);
  25.                         } catch (InterruptedException e) {
  26.                                 // TODO Auto-generated catch block
  27.                                 e.printStackTrace();
  28.                         }
  29.                 }
  30.         }
  31. }




  32. class SailCenter {
  33.         int tircket_count;
  34.        
  35.         public SailCenter(int count) {
  36.                 this.tircket_count = count;
  37.         }
  38.        
  39.         public synchronized int sail() {
  40.                 if(this.tircket_count > 0) return this.tircket_count--;
  41.                 else{
  42.                         System.out.println("Sorry,there is none of trickets");
  43.                         System.exit(0);
  44.                         return 0;
  45.                 }
  46.         }
  47.        
  48. }
复制代码
i want to join in as soon as possible!!!Thanks ,i will great appreciate it!

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 英语不错··

查看全部评分

回复 使用道具 举报
郭宁 发表于 2012-5-22 01:10
等到这个时候就是为了连選四楼哈~
不知道管理员大大 看我这么 夜读圣贤书 会不会每楼都加一分, 好助我早点 ...

娃哈哈~~这下好了!
回复 使用道具 举报
等到这个时候就是为了连選四楼哈~
不知道管理员大大 看我这么 夜读圣贤书 会不会每楼都加一分, 好助我早点去黑马哇~~~~

点评

每天都有··题目··要淡定··亲··  发表于 2012-5-22 01:40
回复 使用道具 举报
郭宁 中级黑马 2012-5-22 01:08:36
9#
  1. package com.ticket;

  2. public class TicketSealCenter {

  3.         /**
  4.          * @param args
  5.          * 售票中心 分配售票窗口 和总票数
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub

  9.                 // 生产 一千张高铁票 送到售票亭
  10.                 Ticket ticket = new Ticket(1000);
  11.                
  12.                 //建立 五个售票窗口吧~~~
  13.                
  14.                 SealWindow sw1 = new SealWindow("售票窗口一",ticket);
  15.                 SealWindow sw2 = new SealWindow("售票窗口二",ticket);
  16.                 SealWindow sw3 = new SealWindow("售票窗口三",ticket);
  17.                 SealWindow sw4 = new SealWindow("售票窗口四",ticket);
  18.                 SealWindow sw5 = new SealWindow("售票窗口五",ticket);
  19.                 new Thread(sw1).start();
  20.                 new Thread(sw2).start();
  21.                 new Thread(sw3).start();
  22.                 new Thread(sw4).start();
  23.                 new Thread(sw5).start();
  24.                
  25.                
  26.                
  27.         }

  28. }
复制代码
回复 使用道具 举报
郭宁 中级黑马 2012-5-22 01:07:43
8#
  1. package com.ticket;

  2. public class SealWindow implements Runnable {
  3.         private String winName;
  4.         private Ticket ticket;
  5.         public SealWindow(String winName,Ticket ticket) {
  6.                 // TODO 设置窗口的名字
  7.                 this.winName = winName;
  8.                 this.ticket = ticket;
  9.         }
  10.         
  11.         @Override
  12.         public void run() {
  13.                 // TODO Auto-generated method stub
  14.                 while(seal());
  15.                         
  16.         }
  17.         
  18.         //高铁票回血大甩卖了啦!!!
  19.         private boolean seal(){

  20.                 synchronized(ticket)
  21.                 {
  22.                         if(ticket.sealTicket())
  23.                         {
  24.                                 System.out.println(winName+"·······售出一张,还剩余:"+ticket.getTicketnum());
  25.                                 return true;
  26.                         }
  27.                         else
  28.                         {
  29.                                 System.out.println(winName+"温柔的给你说“亲~~ 我真不愿意告诉你,票没抢光了~~~~”");
  30.                                 return false;
  31.                         }
  32.                 }
  33.                
  34.         }
  35. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 温柔的给你说“亲~~ 很淘宝体·.

查看全部评分

回复 使用道具 举报
郭宁 中级黑马 2012-5-22 01:06:16
7#
本帖最后由 郭宁 于 2012-5-22 01:07 编辑
  1. package com.ticket;

  2. public class Ticket {
  3.         private  int ticketsnum;
  4.         public Ticket(int ticketnum) {
  5.                 // TODO 设置 默认票数
  6.                 this.ticketsnum = ticketnum;
  7.         }
  8.         
  9.         /**
  10.          * 判断是不是木有票了
  11.          * 是    返回 true
  12.          * 不是返回 false
  13.          * */
  14.         public boolean isEmpty(){

  15.                 if(ticketsnum>0)
  16.                         return false;
  17.                 else
  18.                         return true;
  19.         }
  20.         
  21.         /**
  22.          *返回剩余票数
  23.          * */
  24.         
  25.         public int getTicketnum(){
  26.                
  27.                 return ticketsnum;
  28.         }
  29.         
  30.         
  31.         
  32.         /**
  33.          * 功能:卖票
  34.          * 卖出去了返回 true
  35.          * 没卖出去返回false;
  36.          * */
  37.         public boolean sealTicket(){
  38.                 if(isEmpty())
  39.                 {
  40.                         return false;
  41.                 }
  42.                 else
  43.                 {
  44.                         ticketsnum--;
  45.                         return true;
  46.                 }
  47.                
  48.         }
  49. }
复制代码
回复 使用道具 举报
上面的都是牛人啊。。。
回复 使用道具 举报
余宏 发表于 2012-5-21 23:39
import java.util.Vector;

public class Ticket {  

编写三各类~~~
回复 使用道具 举报
杨永峰 发表于 2012-5-21 23:41
上代码:(自然不够全面、健壮,请多提出改进意见)

我和你做的也一样····就是想看到更多的方法
楼下请继续 答完一起加分
回复 使用道具 举报
本帖最后由 杨永峰 于 2012-5-21 23:47 编辑

上代码:(自然不够全面、健壮,请多提出改进意见)
  1. // 每日一题————————简单模拟售票过程。
  2. public class  SaleWindows {  
  3.          
  4.     public static void main(String[] args){  
  5.   
  6.                 SaleCenter sc = new SaleCenter(200);
  7.                 SaleTicket st = new SaleTicket();  
  8.                 sc.setNum(st);// 售票中心分配票数
  9.                 // 创建线程
  10.                Thread t1 = new Thread(st,"一号窗口");  
  11.                Thread t2 = new Thread(st,"二号窗口");  
  12.                Thread t3 = new Thread(st,"三号窗口");  
  13.                Thread t4 = new Thread(st,"四号窗口");
  14.                Thread t5 = new Thread(st,"五号窗口");
  15.                Thread t6 = new Thread(st,"六号窗口");
  16.                 // 启动线程
  17.                t1.start();  
  18.                t5.start();
  19.                t4.start();
  20.                t2.start();
  21.                t6.start();
  22.                t3.start();
  23.       
  24.          
  25.     }  
  26. }  

  27. class SaleTicket implements Runnable{  
  28.     private int tickets;
  29.       
  30.     public void setTotalNum(int tickets){
  31.                 this.tickets = tickets;// 设置发售总票数
  32.         }  
  33.     private synchronized void sale(){  
  34.         if(tickets > 0){  
  35.             System.out.println(Thread.currentThread().getName() + "售出第 "+ (tickets--)+"张票");  
  36.               
  37.             try{  
  38.                 Thread.sleep(tickets);  
  39.             }catch(InterruptedException e){  
  40.                 e.printStackTrace();  
  41.             }  
  42.         }  
  43.     }  
  44.         
  45.     public void run(){  
  46.         while(tickets > 0){  
  47.             sale();  
  48.         }  
  49.     }  
  50. }  
  51.   
  52. class SaleCenter{
  53.         private int ticketsnum;
  54.         
  55.         SaleCenter(int ticketsnum){
  56.                 this.ticketsnum = ticketsnum;
  57.         }
  58.         public void setNum(SaleTicket st)
  59.         {
  60.                 st.setTotalNum(ticketsnum); // 授权票数上限
  61.         }
  62. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
import java.util.Vector;

public class Ticket {  
     public  int ticketNum = 100;  // 总票数
     private boolean isConsumer = false; // 是否有顾客
    private Vector<Integer> numVector = new Vector<Integer>();

    /**
     * 售票
     */
    public synchronized void saleTicket() {
        // 是否有顾客,没有就等待
        if (!isConsumer) {
            try {
                wait();
            } catch (InterruptedException e1) {
                 e1.printStackTrace();
            }
        }
    }
    /**
     * 获取顾客
      */
    public synchronized void getConsumer() {
        // 是否有顾客,有就等待
        if (isConsumer) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 判断票是否已经售完
         if(ticketNum==0){
            System.out.println("对不起,今天的票已售完,请明天早点来!");
        }
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        isConsumer = true;
        notify();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马