1.NSThread:
(1)最底层的线程管理,运行效率最高,但是使用来管理多个线程不方便;
(2)创建方式:- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument ;
+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;
[NSThread currentThread]用来追踪当前线程(当前任务执行的线程);
[ self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];刷新主线程。
(3)当使用alloc init 初始化线程时,要手动启动(thread start);
(4)当多个线程同时访问同一个数据的时候使用NSCondition,NSClock(线程锁)保证数据同步访问;
2.NSOperation:(是基础类,不能直接使用,没有可用的方法)
(1)NSInvocationOperation子类:
NSInvocationOperation *invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@"invocation"];[invocation start]单独使用Operation必须手动启动,默认在当前线程执行,是同步执行。
(2)NSBlockOperation子类:
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
//具体执行的方法
[self act:@"blockOperation"];
}];
[blockOperation addExecutionBlock:^{ }];添加操作,当NSBlockOperation的操作数大于1的时候会开辟新线程执行。
(3).线程队列:NSOperationQueue,将Operation放在操作队列里面管理线程,会自动启动线程,开辟线程执行任务且为一部操作。
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 2;
[queue addOperation :invocation];
[queue addOperation:blockOperation];
3.GCD(Grand Central Dispatch 中央调度 )(1)当在主线程执行操作时,若使用dispatch_sync操作会造成死锁现象,因为在主线里面任务是顺序执行的,会等待上一个任务执行完毕才会执行下一个任务,而同步操作也是顺序执行任务同样会等待,就这样相互等待另一个任务执行就会死锁。
(2)dispatch_get_main_queue()主队列(属于串行队列是顺序执行的);
dispatch_get_global_queue(long identifier, unsigned long flags)(全局并发队列)
(3)dispatch_sync(dispatch_queue_t queue, ^{
使用情况:当与并发队列一起使用的时候,或者需要等待一个任务执行完毕之后才处理下一个操作的情况。
});
dispatch_sync(dispatch_queue_t queue, ^{
使用情况:执行耗时操作的时候,不需要考虑任务的执行顺序。
});