锁定老帖子 主题:模拟售票口
精华帖 (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(); } } } 由于本人能力有限,程序可能会有错误,还请各位多多指点,小弟在这先谢谢了。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-25
最后修改:2011-01-25
ticketNum==0,好吧
|
|
返回顶楼 | |
发表时间:2011-01-25
低调哥 写道 小沈阳 写道 神马情况
模仿一下 |
|
返回顶楼 | |
发表时间:2011-01-25
真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){ System.out.println("对不起,今天的票已售完,请明天早点来!"); } ^_^ |
|
返回顶楼 | |
发表时间:2011-01-25
不落天空 写道 真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){ System.out.println("对不起,今天的票已售完,请明天早点来!"); } ^_^ 1 == 1 明天来买,还是 再明天来 |
|
返回顶楼 | |
发表时间:2011-01-25
真正的应该是:
1,对不起,您拨打的电话正在通话中。 2,对不起,票已售完。 所以,线程对卖票系统来讲已经无用。 纯娱乐。 |
|
返回顶楼 | |
发表时间:2011-01-25
int buyTicket(Date d) {
if(location==LOC.CHINA) return 0; return 2^2^2^2^2; } |
|
返回顶楼 | |
发表时间:2011-01-25
不落天空 写道 真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){ System.out.println("对不起,今天的票已售完,请明天早点来!"); } ^_^ 实在是太现实了。 |
|
返回顶楼 | |
发表时间:2011-01-25
好2的程序!哎。。。。现实啊!车票翻倍涨
|
|
返回顶楼 | |
发表时间:2011-01-26
不落天空 写道 真正的售票程序没有这么麻烦,春节的时候应该是这样的。
if(1==1){ System.out.println("对不起,今天的票已售完,请明天早点来!"); } ^_^ 没错,就是这样 |
|
返回顶楼 | |