队列分类:
一、串行队列
手动创建的串行队列,里面的任务只能一个挨着一个顺序执行,最多允许开启1条新线程
与同步和异步的关系
串行同步:没有启动新线程,所有任务都由当前线程完成,做完一个再做另一个,完全顺序执行,不论是block块外的任务还是块内的任务,一视同仁
串行异步:另外开启了一条新线程,所有的block块任务都搬到这条新线程上完成,而当前线程会执行放在block块外的其他任务,两个线程一起干活,但特殊的是,由于串行队列的性质,只能线程A做完了一个任务后线程B才能开始做任务,等线程B做完一个任务,线程A才能继续做任务,但做任务的速度是不一定,所以可以看到结果是两个线程的任务是穿插着没有顺序完成的
主队列:一个特殊的串行队列,只有主线程一个线程做任务,不管同步异步都要先执行完主线程里的任务再执行主队列里的任务,只有当主线程的任务执行完毕后,主队列才会调度任务到主线程执行,主线程一般都是按照代码行序执行任务,但主队列要求主线程上的任务要优先完成,所有会造成互相等待,比如:
主队列同步死锁如图所示,主队列要求主线程上的任务优先完成,比如打印A,打印B,loadUI方法的执行,最后再去做同步block块里的打印任务,但主线程做任务的时候按顺序执行,当开始做任务时候,就按顺序,第一遍遍历时候遇到了同步任务,就要开始执行,但主队列要求这个任务放在最后执行,先执行下面的任务,所以造成相互等待,如果实在无法理解,就记住主队列同步这种情况不能用!!!
如果是自创的普通串行队列,则不会出现这种情况,串行同步会按照代码行序,顺序执行任务,即便是耗时操作排在主线程任务前面,也会按顺序先完成耗时任务后才会继续往下执行新任务。
二、并发队列
可以启动多个线程的一种队列,如果启动了多条线程,那多个线程一起做任务,有可能任务会同时完成,最多可以启动64条,哪个线程先做完手头的任务会继续去找未完成的任务去完成
并发同步:没有开启新线程,所有任务只能由当前线程自己完成所有任务,不论是block块内任务还是块外任务,一视同仁,顺序完成,效果同串行同步一模一样
并发异步:开启多个线程一起做任务,相当于雇佣很多个工人一起干活,动作快的,做完再去拿新任务,任务无序完成,一般开发过程中需要耗时的下载任务都使用这种方式执行
全局队列,系统自带的一种并发队列,直接获取就可以,一般如果需要多线程执行任务,直接获取这个全局队列开启多线程任务即可,无需自己创建并发队列,同步和异步的效果同并发同步和异步效果一致
网友评论