iOS - 同步、异步

740 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

通过问题看本质!!!

一、同步和异步

主要影响能不能开启新线程

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】先执行完。