iOS中多线程分为三种:NSThread、NSOperation、GCD
其次,线程分为同步线程与异步线程(同步线程===串行,异步线程===并发)
优点 | 缺点 | |
NSThread | 是三种线程中一种较轻量级的线程,使用方便、简单 | 需要自己去管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等,需要耗费更多系统资源 |
NSOperation | 不需要像NSThread一样自己管理线程的生命周期、线程同步问题等,只需关注自己的业务逻辑处理 | |
GCD | 比前两者更加高效、强大 |
一、NSThread的使用:
//1.在新建的线程中执行target的selector方法,并且支持向函数传递参数,但参数最多只可为1个
[NSThread detachNewThreadSelector:@selector(newThread:) toTarget:self withObject:@10];
//2.新建一个线程,该线程启动时会执行target的selector方法,并且也支持传递参数,参数同样最多为1个
//与上一中方式不同的是此种方式创建的线程不会立刻启动,需要使用start方法启动线程
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(startThread:) object:@10 ];
//启动线程
[newThread start];
//3.获取当前线程
[NSThread currentThread];
//4.取消newThread线程
[newThread cancel];
//5.判断某个线程自己是否被取消
[newThread isCancelled];
//6.结束当前线程
[NSThread exit];
//7.让线程睡一会儿,sleepForTimeInterval参数为要睡的时长
[NSThread sleepForTimeInterval:2];
//线程锁NSLock
NSLock *lock = [[NSLock alloc] init]; //创建一个锁
[lock lock]; //上锁
[lock unlock]; //解锁
二、NSOperation的使用
//注:NSOperation任务必须加入到队列中才可以执行
//NSOperation有两种使用方法;1.使用两个定义好的子类:NSInvocationOperation、NSBlockOperation;2.继承NSOperation
//创建一个队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//设置队列的最大并发量
queue.maxConcurrentOperationCount = 2;
//1.通过NSInvocationOperation创建一个NSOperation线程,执行target中的selector方法,通过object传递一个参数
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cooking:) object:@11];
//2.通过NSBlockOperation创建一个NSOperation线程,在这个任务当中会执行block代码块中的代码
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
//需要执行的代码块
}];
//3.将NSOperation任务添加到队列当中
[queue addOperation:invocationOperation]; //以block方式建立的Operation任务添加到队列中方式与此相同
//4.在主线程self.tableView中执行selector方法
[self.tableView PerformSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
//5.取消Operation线程
[operation cancel];
三、GCD的使用
名次解释:
global:全局
queue:队列
async:异步
sync:同步
//异步
dispatch_async
//除主线程之外的队列
dispatch_get_global_queue
//新建一个除主线程之外的线程,并且在这个线程里边执行block里的代码
dispatch_async(dispatch_get_blobal_queu)
//同步
dispatch_sync
//主线程队列
dispatch_get_main_queue
GCD很强大,我的使用经验很少。但是scorpiozj 总结的比较全面(http://www.cnblogs.com/scorpiozj/archive/2011/07/25/2116459.html)
同时,这篇文章也介绍的比较详细
三类线程放在一块写比较笼统,后面会将此三种线程单独分开写,做更详细的叙述