三个概念:队列,线程,block块
关系:一个队列对应一个或者多个线程,一个线程对应一个或者多个block块
1 线程:一个CPU执行一组CPU命令列的路径就是线程。
每一个dispatch_async或者dispatch_sync都是创建了一个线程并将队列添加到这个线程中(是否开辟新线程根据不同情况有不同注解《注解1》)
2 队列:这是gcd对线程的封装,是一个执行队列。(先进先出顺序)
队列分为serial和concurrent两种队列,serial是同步队列,concurrent是异步队列。(无论是那种队列,都是先进先出,只是有是否等待的区别)
3 block块:他是具体的执行任务模块
注解1:
线程的分配是有系统根据不同创建函数以及不同的队列分配的,我们能干预,但是不能决定。
对于dispatch_sync函数,他是将子线程同步的加到当前线程中。如果是将serial队列添加到线程中,同一个serial队列的block在同一个线程,不同的serial队列的block也是在同一个线程中执行;如果是将concurrent队列添加到线程中,同一个concurrent队列的不同block在不同的线程中,不同的concurrent队列的相同或者不同block在不同的线程中。
对于dispatch_async函数,他是将子线程异步的加到当前线程中。如果是将serial队列添加到线程中,同一个serial队列的block在同一个线程,不同的serial队列的block不在同一个线程中执行;如果是将concurrent队列添加到线程中,同一个concurrent队列的不同block在不同的线程中,不同的concurrent队列的相同或者不同block在不同的线程中。
注解2:
dispatch_sync或者dispatch_async是一个函数,一个创建线程并将队列添加到线程中的函数。他的行为由注释1解释。他决定了当前线程和队列所在线程(根据注释1决定是否有新线程)的关系。(无论何种状况,第一次调用这些函数的时候是创建了新线程的)
队列决定了block与block之间的关系。
注释3:
dispatch_sync和dispatch_async的
实例理解:
下面的操作都是第一次执行
1 线程1中执行 dispatch_async() 是开辟一个线程2 并将queue加到这个线程2中,同时将线程2异步的加载到线程1中。
2 线程1中执行 dispatch_sync() 是开辟一个线程2 并将queue加到这个线程2中,同时将线程2同步的加载到线程1中。
3 线程1中执行 dispatch_sync() 开辟一个线程2。
线程1中执行 dispatch_sync() 开辟一个线程3。(规定此次在必定开创新线程的情况下)
dispatch_sync说明了线程2和线程1的关系。
queue说明了线程2和线程3的关系