网络开始---多线程---线程的安全问题(了解)(四)

页面导航:首页 > 软件编程 > IOS > 网络开始---多线程---线程的安全问题(了解)(四)

网络开始---多线程---线程的安全问题(了解)(四)

来源:互联网 作者:脚本宝典 时间:2015-09-18 13:42 【

///***线程的注意点1.不要同时开太多线程,(1-3条即可,最多不要超过5条)线程概念:1.主线程:UI线程,显示、刷新UI界面、处理UI控件的事件2.子线程(异步线程、后台线程)3.不要把
//
/**
 *  线程的注意点
 1.不要同时开太多线程,(1-3条即可,最多不要超过5条)
 
 线程概念:
 1.主线程: UI线程,显示、刷新UI界面、处理UI控件的事件
 2.子线程(异步线程、后台线程)
 
 3.不要把耗时的操作放在主线程,要放在子线程中执行
 
 
 这里是3个窗口卖票的案例
 */

#import "HMViewController.h"

@interface HMViewController ()
//3个窗口3条线程
@property (nonatomic, strong) NSThread *thread1;
@property (nonatomic, strong) NSThread *thread2;
@property (nonatomic, strong) NSThread *thread3;

/**
 *  剩余票数
 */
@property (nonatomic, assign) int leftTicketCount;


//锁对象,用一把锁,不要经常换锁,才能保证线程的安全
[email protected] (nonatomic, strong) NSObject *locker;
@end

@implementation HMViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //开始剩余的票数为50张
    self.leftTicketCount = 50;
    
    //创建线程
    self.thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    //线程名称
    self.thread1.name = @"1号窗口";
    
    self.thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread2.name = @"2号窗口";
    
    self.thread3 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread3.name = @"3号窗口";
    
//    self.locker = [[NSObject alloc] init];
}

//点击启动线程  3个窗口同时开始卖票,
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.thread1 start];
    [self.thread2 start];
    [self.thread3 start];
}

/**
 *  卖票
 */
- (void)saleTicket
{
    while (1) {  //写个死循环一直卖,卖光为止
        
        // ()小括号里面放的是锁对象  括号里面用self就行了,标示唯一的一把锁
        
        @synchronized(self) {// 开始加锁  叫做互斥锁
            
            //保证一个线程访问资源时其他线程不能访问该资源,[email protected],保证线程的安全
            
            //多条线程抢夺同一块资源时才需要加锁,要不然非常耗费CPU资源
            //线程同步:按顺序的执行任务,线程同步问题就 加锁 解决问题
            //互斥锁就是使用了线程同步技术
            
            //取出剩余的票数
            int count = self.leftTicketCount;
            //如果票数大于0
            if (count > 0) {
                [NSThread sleepForTimeInterval:0.05];
                
                //剩余的票数-1
                self.leftTicketCount = count - 1;
                
                NSLog(@"[email protected], 剩余%d张票", [NSThread currentThread].name, self.leftTicketCount);
            } else {  //如果票数为0,退出循环
                
                return; // 退出循环
                
            }
        } // 解锁
    }
}

@end


Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<