小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
通过问题看本质!!!
一、同步和异步
主要影响能不能开启新线程
asnyc异步:新线程种执行任务,具有开启新线程的能力。(不一定会开启,比如在主队列)
aync同步:当前线程种执行任务,不具备开启新线程的能力。
二、并发和串行
主要影响任务的执行方式
并发:多个任务并发执行
串行:一个任务执行完毕后,再执行下一个任务
| 并发队列 | 手动创建的串行队列 | 主队列 | |
|---|---|---|---|
| 同步 Sync | 没有开启新线程,串行执行任务 | 没有开启新线程,串行执行任务 | 没有开启新线程,串行执行任务 |
| 异步Async | 开启了新线程,并发执行任务 | 开启了新线程,串行执行任务 | 没有开启新线程,串行执行任务 |
死锁:往当前串行队列添加同步任务,会卡住当前串行队列,会产生死锁
二、多线程的部分用法
1、performSelector: withObject: afterDelay:
这个方法底层是用了RunLoop技术,添加一个定时器到RunLoop中,所以在子线程中调用该方法,必须手动开启RunLoop
2、performSelector: onThread: withObject:nil waitUntilDone:
如果参数thread没有保活,那么线程在创建后执行完任务就会退出,调用该方法后,就会报错“线程已退出”。
3、dispatch_sync
-(void)testDispatchSync{
NSLog(@"---------->1 = %@",[NSThread currentThread]);
dispatch_queue_t queue = dispatch_queue_create("serqueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{//block 0
NSLog(@"---------->2 = %@",[NSThread currentThread]);
dispatch_sync(queue, ^{//block 1
NSLog(@"---->3 = %@",[NSThread currentThread]);
});
NSLog(@"---------->4 = %@",[NSThread currentThread]);
});
NSLog(@"---------->5 = %@",[NSThread currentThread]);
}
1)出现死锁情况
2)打印 1->2 ,然后死锁了 在block1锁住了 报错EXC_BAD_INSTRUCTION
3)因为是串行队列,block0在执行完【任务2】的时候,要马上去执行【任务3】,但是执行【任务3】必须要先执行【任务4】,而执行【任务4】必须等待【任务3】先执行完。