多线程初解(1)--卖票系统

本文介绍如何在iOS应用中实现买票系统的线程并发管理,通过定义全局变量和使用NSCondition锁来确保三个售票窗口同时销售时的票数正确更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义全局变量方便使用


    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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ldl_csdn_ios

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值