在用GCD之前先来关注三个问题,用什么函数执行?执行什么任务?在什么队列里面执行?以上三个问题可以看做是组成GCD的三个部分
这里主要想用实验对比异步并发或者异步全局与异步串行的区别
Number1:先来复习一下
1.用什么函数执行.执行GCD的函数有两个:同步函数和异步函数.
同步函数:
dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
异步函数:
dispatch_async(<#dispatch_queue_t queue#>, <#^(void)block#>)
可以看到,两者在API的区别就要在于异步函数比同步函数多了一个a
同步函数:不可以开启新的线程,只能在当前线程执行任务(当前可以是主线程,或者其他线程)
异步函数:可以开启新的线程,并在新的线程执行任务.异步函数可以看做是多线程的代名词.
2.执行什么任务
只需要将执行的代码可以写在block中既可以了
3.用什么队列执行
常用到的队列以下几种:
1)并发队列:
dispatch_queue_t queue = dispatch_queue_create("�队列的名字",DISPATCH_QUEUE_CONCURRENT);
1.以先进先出的方式,在并发调度队列中的任务执行
2.如果当前调度的任务是同步的,会等待任务执行完成后,才会去执行下一任务
3.如果当前调度的任务是异步的执行的,只要底层线程池中有可用的线程,就会马上去执
行任务,不需要等待上一个任务的完成。
下面我们来做一个实验:以下是异步并发队列执行的代码
打印的前面一个参数代表当前的线程,从上面的打印结果我们看到了什么?首先从number可以看出这里出现了不止一条线程,起码这个打印结果出现了31条线程.
其次看后面打印的数字,并不是依次增大的,顺序是被打断的.为什么会这样呢?先执行的却在后面被打印出来,而for循环是依次+1增大的.这就说明了,并发队列在异步函数里面执行时并不会等到上一个任务执行完毕再执行下一个任务,上一个任务它会执行一部分,然后下一个任务再执行一部分,如果有多条线程,它(CPU)会在多条线程(多个任务)之间来回切换,这个执行一点那个也执行一点.也许会按顺序执行完成,也许不会按顺序执行完成(先执行的可能后执行完,也可能先执行的玩,这是不确定的,是CPU决定的). � 总结起来一句话,如果当前调度的任务是异步的执行的,只要底层线程池中有可用的线程,就会马上去执行任务,不需要等待上一个任务的完成。
2).全局队列:
是系统为了方便程序员开发提供的,其工作表现与并发队列一致
上代码:
反正和并发队列差不多啦,只是程序员自己用推荐用他,不过不知道为什么
3)串行队列:
1.以先进先出的方式,顺充调度队列的任务
2.无论队列所指定的是执行函数是同步还是导步,都会等上一个任务执行完成之后再执行下
一个任务
上面打印结果说明了什么?串行队列在异步函数里面执行只会开启一条线程,而且看后面打印的数字,都是顺序的,从1到100都是,只是太长就不全部接下来了,不放心可以自己试一试.为什么是顺序的?当然如果没有多线程这句话是屁话,但是相较于上面的异步函数并发或者全局队列,这说明,串行队列在执行性任务的时候是顺序执行的,只有上一个任务执行完才会执行下一个任务
4).主队列:dispatch_queue_t queue =dispatch_get_main_queue();
主队列不需要创建,它是程序启动就被创建的