定义全局变量方便使用
UILabel *showLabel;
int curTicketNum;
int saleTicketNum;
NSString *curWindow;
NSCondition *condition;
self.view.backgroundColor = [UIColor orangeColor];
// 买票系统 分三个窗口 同时销售
curTicketNum =100;
// 默认100张票
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 20, 150, 30);
[button setTitle:@"开始卖票" forState:UIControlStateNormal];
[button addTarget:self action:@selector(startsale) forControlEvents: UIControlEventTouchUpInside];
[self.view addSubview:button];
showLabel = [[UILabel alloc]initWithFrame:CGRectMake(50, 200, 300, 30)];
showLabel.text =@"剩余100张票";
[self.view addSubview:showLabel];
-(void)startsale
{
// 初始化 三个线程 每一个线程是一个售票窗口
NSThread *firstWindow = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
firstWindow.name =@"1号窗口";
//需要手动开始
[firstWindow start];
NSThread *towWindow = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
towWindow.name =@"2号窗口";
[towWindow start];
NSThread *thirdWindow = [[NSThread alloc]initWithTarget:self selector:@selector(saleTicket) object:nil];
thirdWindow.name =@"3号窗口";
[thirdWindow start];
}
-(void)saleTicket
{
// 没有 使用线程锁 三个线程(窗口)会同时 访问这个方法 (买票的方法) 这个 当剩余的票数 是0 的时候 有可能其他 两个线程 不知道 剩余票数是0 还会继续访问 这样就会有剩余票数是负数的情况
// 解决这个问题 可以使用线程锁
// 、只允许 一个线程 访问完毕之后 另外一个线程在访问
// 使用线程锁 只允许一个线程访问
while (curTicketNum>0) {
[NSThread sleepForTimeInterval:0.1];
[condition lock];
// 当前票数
curTicketNum-=1;
// 卖的票数
saleTicketNum = 100- curTicketNum;
curWindow = [NSThread currentThread].name;
if (curTicketNum>0) {
[condition unlock];
}
//
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];
}
}
-(void)updateUI
{
showLabel.text = [NSString stringWithFormat:@"已经卖出:%d张 还剩%d张",saleTicketNum,curTicketNum];
}