/*
线程:一条独立执行的代码路径
进程:一个可执行的程序可以有多条线程同时执行
多线程:一个可执行程序(进程)同时拥有多条独立执行的代码路径(线程)
线程:
1.主线程:刷新UI响应用户的触摸事件
2.分线程:处理耗时任务操作---下载大量运算
*/
//有个NSThread对象,就是一个线程
//1.创建一个线程-----需要手动开启
// NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(<#selector#>) object:nil];
//2.默认开启
// [NSThread detachNewThreadSelector:@selector(<#selector#>) toTarget:self withObject:nil];
//3.默认开启
// [self performSelectorInBackground:@selector(<#selector#>) withObject:nil];
//2.3优缺点
//优点:简单快捷缺点:无法给线程设置属性
// waitUntilDone BOOL类型YES表示等待当前方法执行完才返回主线程. NO表示执行到这句时就返回到主线程
// [self performSelectorOnMainThread:@selector(numberOut) withObject:nil waitUntilDone:NO];
// //1.创建一个队列
// _queue = [[NSOperationQueue alloc]init];
// //2.添加操作
// NSInvocationOperation * operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];
// NSBlockOperation * blockOperation = [NSBlockOperation blockOperationWithBlock:^{
// [self sellTickets];
// }];
// [_queue addOperation:operation];
@property(nonatomic,strong)NSLock* lock;
@property(nonatomic,strong)NSCondition* condition;
//创建锁
self.lock= [[NSLockalloc]init];
self.condition= [[NSConditionalloc]init];
//当多条线程同时访问一个数据(一段代码)的时候会引起数据错乱30
//解决方法:线程同步
//线程同步:当多条线程同时访问一个数据(一段代码)的时候,让其顺序访问
//实现线程同步有三种方式
//互斥锁10
//1. @synchronized(self){内容代码}
//2.{[self.lock lock];内容代码;[self.lock unlock];}
//3.{[self.condition lock];内容代码;[self.condition unlock];}
//并发:一起发生
//串行:按顺序的一个一个发生
while(1) {
//1. @synchronized(self) {
//2. [self.lock lock];
//3.[self.conditionlock];
intcount =_leftTickets;
if(count > 0) {
//让当前线程1秒
//sleep(1);
[NSThreadsleepForTimeInterval:1];
_leftTickets= count - 1;
NSLog(@"%@买了一张票%d %@",[NSThreadcurrentThread].name,_leftTickets,[NSThreadcurrentThread]);
}else{
//线程退出
///[NSThread exit];
//取消所有操作
[_queuecancelAllOperations];
break;
}
//[self.conditionunlock];
//[self.lock unlock];