前些天因为一个并发线程的的bug和同事讨论了下GCD,发现他们都会用,但是说到具体原理和细节,发现他们并不清楚,所以普及一下基础概念。
我们先要了解两个东西,一个是队列,一个是线程池
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)异步
dispatch_sync(<#dispatch_queue_t _Nonnull queue#>, <#^(void)block#>)同步
第一个参数 就是要从线程池取出的线程
第二个参数 就是从队列中所取出的任务
GCD的同步方法是不会从线程池中拿取线程,所以不论我们使用串行队列还是并行队列的任务都只在主线程上执行
异步方法,是会从线程池中拿取线程,如果是串行队列,那么只会拿取一条线程,并在这一条子线程上逐一执行任务,若果是并行队列,就会拿去多条线程,队列里的任务,并发在个个线程上执行,(并发不代表同时,五个流水线都可以加工产品叫做并发),至于谁先执行要看cup的调度。
希望这些可以帮助对gcd概念不清楚的朋友解惑,gcd是通过队列调度线程,而不是线程