在开发过程当中使用的多线程方式一般有三种,NSThread,NSOperation/NSOperationQueue,GCD
NSThread需要手动管理线程的生命周期,使用NSThread 可以中途取消任务,也可以设置线程的优先级(0-1 越大优先级越高,默认都是0.5)在NSObject中苹果官方对其进行了封装
可以直接调用
-(void)performSelectorInBackGround:(SEL)aSelector withObject:(id)arg;
在后台直接调用一个方法执行,本质就是自动建一个线程,然后在其中执行一个操作
-(void)performSelector:(SEL)aSelector onThread:(NSThread*)thewithObject:(id)arg waitUntilDone:(BOOL)wait
在指定线程上执行一个操作,需要用户创建一个线程对象
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)argwaitUntilDone:(BOOL)wait;
在主线程执行一个操作
-(void)performSelector:(SEL)aSelector withObject:(id)arg afterDelay:(NSTimeInterval)time;
另开一个线程延迟指定时间后再执行这个操作
NSOperationQueue 是一个线程队列 可以创建一个NSOperation对象来放入队列中执行,一般是使用NSOperation的子类来创建一个任务,NSOperation有两个子类,一个是NSInvocationOperation 另一个是NSBlockOperation,使用NSOperationQueue可以设置最大线程并发数量,并且可以使用[operation1addDependency:operation2】来_添加依赖,operation1需要等到operation2执行完毕后再执行
GCD
GCD是一种基于C语言的一种多线程开发机制,
在GCD当中有两种队列 串行队列:在当前线程执行,添加在其中的任务按照顺序依次执行
并发队列:将添加进来的任务分配在可用的处理器上,同时执行。
在GCD中也有两种执行方法,dispatch_async 异步执行
dispatch_sync 同步执行
可以通过dispatch_queue_t queue = dispatch_queue_creat(“你的队列名”,DISPATCH_QUEUE_SERIAL)
来创建一个串行队列
通过dispach_get_main_queue() 获得主队列 一般在主队列中执行更新UI的方法
。0+
而获取并发队列的方法类似 dispatch_queue_creat)(“你的队列名”,DISPATCH_QUEUE_CONCURRENT)
但是一般在开发中我们无需创建一个新的并发队列,我们可以通过
dispatch_get_global_queue 来获取一个全局并行队列:
下面说一下GCD当中常用的方法
dispatch_apply():重复执行某个任务,不过这个方法没有办法异步执行(不过可以用dispatch_async包装一下就OK了)
dispatch_once() 这个方法只会执行一次,从此以后在程序没有退出以前就不会在执行,一般用来自定义一个单例对象是使用
dispatch_after()可以延迟一定时间执行一个任务,并且是异步的。
虽然多线程能够提高程序的性能,但是有时候当多个线程抢夺同一个资源是就需要使用线程同步了 NSThread使用线程同步一般可以使用NSLock同步锁,还有NSCondition, 但是一般使用@synchronized(self){ }代码块,这样比较方便
@synchronized(self){…………………………………………..000
// 修改
}
{
NSlock l = [NSLock alloc]init];
[l lock];
// 修改操作
[l unlock];
}