场景:比较轻量级的,多线程使用NSThread,一般配合NSLock(锁),NSConditon(条件变量)使用
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销。
以下用卖票作为例子进行该知识点的应用
头文件
#import <Cocoa/Cocoa.h>
@interface ThreadBase : NSObject
{
int tickets;
int iCount;
NSThread* threadone;
NSThread* threadtwo;
NSCondition* theCondition;
NSLock *theLock;
}
@end
源文件
#import "ThreadBase.h"
@implementation ThreadBase
-(void)awakeFromNib
{
tickets = 20;
iCount = 0;
// 锁对象和条件变量
theLock = [[NSLock alloc] init];
theCondition = [[NSCondition alloc] init];
//创建三个线程
threadone = [[NSThread alloc] initWithTarget:self selector:@selector(customerTickets) object:nil];
[threadone setName:@"Thread-1"];
[threadone start];
threadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(customerTickets) object:nil];
[threadtwo setName:@"Thread-2"];
[threadtwo start];
NSThread *threadthree = [[NSThread alloc] initWithTarget:self selector:@selector(threadLock) object:nil];
[threadthree setName:@"Thread-3"];
[threadthree start];
}
-(void)threadLock{
while (true)
{
//对线程进行加锁
[theCondition lock];
[NSThread sleepForTimeInterval:1.0];
[theCondition signal];
[theCondition unlock];
}
}
-(void)customerTickets{
while (true)
{
// 上锁
[theCondition lock];
[theLock lock];
if(tickets >= 0){
[NSThread sleepForTimeInterval:0.09];
iCount = 20 - tickets;
NSLog(@"当前票数是:%d,售出:%d,线程名:%@",tickets,iCount,[[NSThread currentThread] name]);
tickets--;
}else{
//结束线程
break;
}
[theLock unlock];
[theCondition unlock];
}
}
@end
运行结果: