买了<<Objective-C高级编程 iOS与OS X多线程和内存管理>>,发现自己以前理解的GCD多线程是错误的
以前理解的dispatch_async就会开一个新的线程去执行任务,其实是不对的.
按照书中理解的,dispatch_get_main_queue是一个主队列,这个队列是一个串行队列,是在主线程上执行的队列,也就是number=1的线程上.
全局队列*dispatch_get_global_queue(0, 0)*是一个全局的并行队列.
串行队列和并行队列的区别是: 串行队列中的任务是按先进先出的顺序执行的. 并行队列中的任务是允许同时多个线程去执行的.
dispatch_sync是同步追加任务到队列.追加任务会等待队列前面的任务执行完后再执行追加的任务. dispatch_async是异步追加任务到队列.追加任务不会等待队列中的其他任务执行完成.(队列任务可以异步执行,你先走,不用管我)
串行队列同步追加
追加到当前的线程中,会等待当前线程中前面的任务执行完毕后在执行追加的任务
queue.sync {
print("queue - \(Thread.current)")
}
复制代码
串行队列异步追加
追加到串行队列的线程中,会等待串行队列中的任务执行完毕后执行追加的任务,当前线程不受影响
queue.async {
print("queue - \(Thread.current)")
}
复制代码
并行队列同步追加
追加到当前的线程中,会等待当前线程.
conQueue.sync {
print("2 - \(Thread.current)")
}
复制代码
并行队列异步追加
追加到并行队列的线程中,因为是并行队列,可以开启多个线程执行多个任务,不会等待.我们常用的就是这种
conQueue.async {
print("2 - \(Thread.current)")
}
复制代码