论坛首页 Java企业应用论坛

模拟售票口

浏览 6918 次
锁定老帖子 主题:模拟售票口
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-24   最后修改:2011-01-25
票真难买呀,咋回个家就怎么难呢? 
  这几天学习了下线程,加上买票的事,就写了个模拟售票窗口买票的问题:有四个窗口对顾客售票,一个顾客只能买一张票.
  1.Consumer类
/**
* 顾客
* @author xpery
*
*/
public class Consumer  implements Runnable {
    private Ticket ticket;
    public Consumer(Ticket ticket){
        this.ticket= ticket;
    }
    public void run() {
        while(true){
            ticket.getConsumer();
            if(ticket.ticketNum<=0){
                System.out.println("售票窗口已关闭,请明天再来!");
                break;
            }
        }
    }
}

2.Windows类
/**
* 窗口
* @author Xpery
*
*/
public class Windows implements Runnable {
    private Ticket ticket;

    public Windows(Ticket ticket){
        this.ticket = ticket;
    }
    public void run() {
        while (true) {
            ticket.saleTicket();
            if(ticket.ticketNum<=0){
                System.out.println("关闭售票窗口"+Thread.currentThread().getName());
                 break;
            }
        }
    }
}

3.Ticket类
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();
            }
        }
        if (ticketNum > 0) {
            System.out.println(Thread.currentThread().getName() + "卖给"
                + getConsumerName() + "一张票,票号为:" + ticketNum-- + "票");
        }
        try {
             Thread.sleep(10);
        } catch (InterruptedException e) {
             e.printStackTrace();
        }
        isConsumer = false;
        notify();
    }
    /**
     * 获取顾客
      */
    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();
        }
    /**
     * 获取顾客名称
      * @return
     */
    public String getConsumerName() {
        int num = Integer.valueOf((int)(Math.random() * 999 + 1));
        String consumerName="顾客" + num;
        // 判断是否有人重复买票
         while (numVector.contains(num)) {
            System.out.println("对不起,"+consumerName+" ,您已经买了一张票,不能再买一张了");
            num = Integer.valueOf((int)(Math.random() * 999 + 1));
        }
        numVector.add(num);
        return consumerName;
    }
}
4.主程序:MianTest
public class MianTest {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();

       /**
        * 产生一个顾客对象,用来获取顾客
         */
        Consumer consumer = new Consumer(ticket);
        Thread threadConsumer = new Thread(consumer);
        threadConsumer.start();

       /**
        * 产生四个窗口
         */
        Windows windows = new Windows(ticket);
        for (int i = 1; i < 5; i++) {
            Thread threadWindows = new Thread(windows);
            threadWindows.setName(i + "号窗口");
            threadWindows.start();
        }
    }
}


由于本人能力有限,程序可能会有错误,还请各位多多指点,小弟在这先谢谢了。
   发表时间:2011-01-25   最后修改:2011-01-25
ticketNum==0,好吧
0 请登录后投票
   发表时间:2011-01-25  
低调哥 写道
小沈阳 写道
神马情况

模仿一下

0 请登录后投票
   发表时间:2011-01-25  
真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){
            System.out.println("对不起,今天的票已售完,请明天早点来!");
        }
^_^
0 请登录后投票
   发表时间:2011-01-25  
不落天空 写道
真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){
            System.out.println("对不起,今天的票已售完,请明天早点来!");
        }
^_^

1 == 1 明天来买,还是 再明天来
0 请登录后投票
   发表时间:2011-01-25  
真正的应该是:
1,对不起,您拨打的电话正在通话中。
2,对不起,票已售完。

所以,线程对卖票系统来讲已经无用。

纯娱乐。
0 请登录后投票
   发表时间:2011-01-25  
int buyTicket(Date d) {
    if(location==LOC.CHINA)
       return 0;
    return 2^2^2^2^2;
}
0 请登录后投票
   发表时间:2011-01-25  
不落天空 写道
真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){
            System.out.println("对不起,今天的票已售完,请明天早点来!");
        }
^_^

实在是太现实了。  
0 请登录后投票
   发表时间:2011-01-25  
好2的程序!哎。。。。现实啊!车票翻倍涨
0 请登录后投票
   发表时间:2011-01-26  
不落天空 写道
真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){
            System.out.println("对不起,今天的票已售完,请明天早点来!");
        }
^_^



没错,就是这样
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics