黑马程序员技术交流社区
标题:
应该是道面试题,求帮助!
[打印本页]
作者:
安然无恙
时间:
2015-10-8 20:06
标题:
应该是道面试题,求帮助!
本帖最后由 安然无恙 于 2015-10-8 20:14 编辑
编写 三个类 ticket,sellWindow,ticketSellCenter,代表票信息,售票窗口,售票中心,售票中心分配一定数量的票(多个窗口实现多线程售票)
这道题我有答案,但是三个类不知道先写哪个类,方法都是互通的,先写哪个类都写不完整,求大神带上思路和代码! 在下感激不尽!良辰必有重谢
下面是我的代码,参考的别人的答案,但是不知从哪个类下手,注释自己添加的,有不对的希望大神指正!
//测试类
public class MianShi{
public static void main(String[] args) {
//创建对象
MianShi t = new MianShi();
//调用票信息
t.new Ticket();
}
//票信息
class Ticket {
//构造方法
public Ticket() {
//售票中心有一百张票
TicketSealCenter tsc = new TicketSealCenter(100);
// 创建5个窗口(循环5次)
for (int i = 1; i <= 5; i++) {
//创建窗口 创建售票窗口对象 传入窗口和票数
Thread t = new Thread(new SealWindow(i, tsc));
//开启线程
t.start();
}
}
}
//售票中心类 定义了票的总数,同步售票方法
class TicketSealCenter {
//初始化票数
int ticketNum = 0;
// 定义票是否卖完
boolean flag = false;
// 定义一个改变票数的方法
public TicketSealCenter(int num) {
//把100张票赋值给当前变量
this.ticketNum = num;
}
//同步方法
public synchronized void sellTicket(SealWindow s) {
//票数如果大于0
if (ticketNum > 0) {
//就把票数分配到各窗口
int n = s.num;
//票数--
System.out.println("第" + n + "售票窗口卖出了第" + (ticketNum--) + "张票");
} else {
//否则就为true
flag = true;
}
}
}
//创建售票窗口类
class SealWindow implements Runnable {
//num表示第几号窗口
int num;
//tsc代表售票中心
TicketSealCenter tsc;
//构造方法 把窗口和售票中心
public SealWindow(int num, TicketSealCenter tsc) {
this.num = num;
this.tsc = tsc;
}
//重写run方法
public final void run() {
//只要售票中心的票数没卖完 就一直循环
while (!tsc.flag) {
// 调用售票中心类的同步票数
tsc.sellTicket(this);
try {
//延迟100毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
复制代码
作者:
安然无恙
时间:
2015-10-8 20:14
自己顶一下~ 求助!!
作者:
安然无恙
时间:
2015-10-8 20:41
求助... 在线等
作者:
fmi110
时间:
2015-10-8 20:48
来啦 纯手打
public class SellTicketDemo {
/**
*编写 三个类 ticket,sellWindow,ticketSellCenter,代表票信息,售票窗口,售票中心,
*售票中心分配一定数量的票(多个窗口实现多线程售票)
*
*分析: 程序要实现的功能是卖票,跟卖票相关的操作有:设置票的总数setTicket(int num)、卖票sellTicket()、
*记录票的余数的变量 Ticket;
* 其中 ticketSellCenter 应该进行设置形式,即行使 setTiket的功能。售票窗 行使卖票功能。
* 因为卖票是多线程进行,所以设置票,卖票的行为会出现同时访问 票Ticket的情况,即他们需要进行同步。
* 考虑到函数同步需要使用同一个锁,所以把设置票的功能和卖票的功能放到同一个类中,方便实现同步。因此将他们
* 直接放到ticket类中,由其他类来调用
*/
public static void main(String[] args) {
Ticket t = new Ticket();//票的对象,所有操作都是对该对象进行
new TicketSellCenter(t).start();//启动设置线程,设置票的总数
for(int i = 0;i<3;i++){
new SellWindow(t).start();
}
}
}
class Ticket{
private int ticket;
public synchronized void setTicket(int num){//设置票的数量,需要同步
this.ticket = num;
System.out.println(Thread.currentThread().getName()+"设置票的总数为:"+num);
}
public synchronized void sellTicekt(){//卖票功能,需要同步
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+" 卖出一张票,剩余 "+(--ticket )+"张票");
}
}
public int getTicket(){//对外提供票的余数
return ticket;
}
}
class SellWindow extends Thread{
private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作
public SellWindow(Ticket t) {
super();
this.t = t;
}
@Override
public void run() {//此线程的功能是卖票,所以在run里调用卖票的方法即可
while(t.getTicket()>0){//余票大于0时,进行卖票
t.sellTicekt();
}
}
}
class TicketSellCenter extends Thread{
private Ticket t; //接收Ticket对象,保证卖票是对同一对象进行操作
public TicketSellCenter(Ticket t) {
super();
this.t = t;
}
@Override
public void run() {//功能是设置票,所以调用设置的函数运行就可以,而不需要将设置行为的具体代码放在里面
t.setTicket(100);//设为100张票
}
}
复制代码
作者:
fmi110
时间:
2015-10-8 20:50
运行效果
Thread-0设置票的总数为:100
Thread-2 卖出一张票,剩余 99张票
Thread-2 卖出一张票,剩余 98张票
Thread-2 卖出一张票,剩余 97张票
Thread-2 卖出一张票,剩余 96张票
Thread-1 卖出一张票,剩余 95张票
Thread-3 卖出一张票,剩余 94张票
Thread-3 卖出一张票,剩余 93张票
Thread-3 卖出一张票,剩余 92张票
Thread-3 卖出一张票,剩余 91张票
Thread-1 卖出一张票,剩余 90张票
Thread-1 卖出一张票,剩余 89张票
Thread-1 卖出一张票,剩余 88张票
Thread-1 卖出一张票,剩余 87张票
Thread-1 卖出一张票,剩余 86张票
Thread-2 卖出一张票,剩余 85张票
Thread-1 卖出一张票,剩余 84张票
Thread-3 卖出一张票,剩余 83张票
Thread-1 卖出一张票,剩余 82张票
Thread-1 卖出一张票,剩余 81张票
Thread-1 卖出一张票,剩余 80张票
Thread-2 卖出一张票,剩余 79张票
Thread-1 卖出一张票,剩余 78张票
Thread-1 卖出一张票,剩余 77张票
Thread-1 卖出一张票,剩余 76张票
Thread-3 卖出一张票,剩余 75张票
Thread-3 卖出一张票,剩余 74张票
Thread-3 卖出一张票,剩余 73张票
Thread-3 卖出一张票,剩余 72张票
复制代码
作者:
安然无恙
时间:
2015-10-8 20:58
fmi110 发表于 2015-10-8 20:50
运行效果
容我看看~~ 谢谢大神
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2